 From the documentation

    A `Place` must `invite()` all kind of `Agents` that produce `Work` or
    other kind of valuable social interactions. Depending of the total
    `reputation` of the `Place` it will determine it's `underground`
    status: when going out of the `underground`, it will become an
    institution.

NAME

    Art::World - Agents interactions modeling

SYNOPSIS

      use Art::World;
    
      my $artwork = Art::World->new_artwork(
        creator => [ $artist, $another_artist ]  ,
        value => 100,
        owner => 'smonff' );

DESCRIPTION

    Art::World is an attempt to model and simulate a system describing the
    interactions and influences between the various agents of the art
    world.

    More informations about the purposes and aims of this project can be
    found in it's Art::World::Manual. Especially, the HISTORY and the
    OBJECTIVES section could be very handy to understand how this is an
    artwork using programming.

ROLES

 Abstraction

    This is were all kind of weird phenomenons happen. See the Manual about
    how it works.

 Active

    Provide a participate method.

 Buyer

    Provide a aquire method requiring some money. All this behavior and
    attributes are encapsulated in the Buyer role because there is no such
    thing as somebody in the art world that buy but doesn't sale.

 Collectionable

    If it's collectionable, it can go to a Collector collection or in a
    Museum.

 Crud

    The Crud role makes possible to serialize most of the entities. For
    this to be possible, they need to have a corresponding table in the
    database, plus they need to not have a unserializable? tag attribute. A
    Zydeco tag role is a role without behavior that can only be checked
    using does.

    The Crud role is made possible thanks to Teng, a simple DBI wrapper and
    O/R Mapper. Teng is used through it's schema loader that directly
    instanciate an object schema from the database.

    When trying to update a value, it is necessary to pass a table name and
    a hashref of attributes. The table name is not case sensitive.

 Event

    All the necessary attributes and methodes for having fun between
    Art::world's Agents.

 Exhibit

    Role for Places that display some Artworks.

 Fame

    Fame role provide ways to control the aura and reputation that various
    Agents, Places or Works have. Cannot be negative.

    It has an handy bump_fame() method that self-bump the fame count. It
    can be used in three specific maneers:

    pass a PositiveNum

      The fame will go higher

    pass a NegativeNum

      The fame he fame will go lower

    no parameter

      In that case the value defined by $self-config->{ FAME }->{
      DEFAULT_BUMP }> will be used to increase the reputation.

      my $artist = Art::World->new_artist(
        reputation => 0.42,
        name => 'Questular Rontok'
      );
    
      say $artist->bump_fame;               # ==>  1.42
      say $artist->bump_fame( 0.0042 );     # ==>  1.4242

    If you try to update the fame to a negative value, nothing happens and
    a nice warning is displayed.

    The fame can be consummed by pretty much everything. A Place or and
    Agent have a fame through it's reputation, and an Artwork too through
    it's aura.

    Classes that consume Fame can have two different kind of attributes for
    storing the Fame:

    aura

      For Works only.

    reputation

      For Agents, Places, etc.

 Market

    It is all about offer and demand. Involve a price but should involve
    more money I guess.

 Manager

    A role for those who take care of exhibitions and other organizational
    matters. See how being a Manager influence an Agent in the CLASSES
    section.

 Showable

    Only an object that does the Showable role can be exhibited. An object
    should be exhibited only if it reached the Showable stage.

CLASSES

 Agent

    They are the activists of the Art World, previously known as the
    Wildlife.

      my $agent = Art::World->new_agent( name => $f->person_name );
    
      $agent->participate;    # ==>  "That's interesting"

    A generic entity that can be any activist of the Art::World. Provides
    all kind of Agent classes and roles.

    The Agent got an a networking( $people ) method. When it is passed and
    ArrayRef of various implementation classes of Agents (Artist, Curator,
    etc.) it bumps the reputation attributes of all of 1/10 of the Agent
    with the highest reputation. If this reputation is less than 1, it is
    rounded to the $self-config->{ FAME }->{ DEFAULT_BUMP }> constant.

    The bump coefficient can be adjusted in the configuration through {
    FAME }-{ BUMP_COEFFICIENT }>.

    There is also a special way of bumping fame when Managers are in a
    Networking activity: The influence() method makes possible to apply the
    special $self-config->{ FAME }->{ MANAGER_BUMP }> constant. Then the
    Agents reputations are bumped by the MANAGER_BUMP value multiplicated
    by the highest networking Manager reputation. This is what the
    influence() method returns:

      return $self->config->{ FAME }->{ MANAGER_BUMP } * $reputation;

    The default values can be edited in art.conf.

 Art

    Will be what you decide it to be depending on how you combine all the
    entities.

 Article

    Something in a Magazine of Website about Art, Exhibitions, etc.

 Artist

    In the beginning of their carreer they are usually underground and
    produce experimental art, but this can change in time.

      $artist->is_underground if not $artist->has_collectors;

    After getting collected, artists become homogenic.

    The artist got a lots of wonderful powers:

    create

      When the basic abstractions of Art are articulated, a creation
      occurs. It doesn't mean that it will create an Artwork, because it
      requires the intervention of other Agents. The Artist creates through
      a work concept. This articulation can group the different attributes
      of the Abstraction role: discourse, file, idea, process, project and
      time.

    have_idea all day long

 Artwork

    The base thing producted by artists. Artwork is subclass of
    WorkArt::World::Work that have a Showable and Collectionable role.

 Book

    Where a lot of theory is written by Critics

 Collector

 Collective

    They do stuff together. You know, art is not about lonely Artists in
    their Workshop.

 Concept

    Concept is an abstract class that does the Abstraction role.

 Critic

 Curator

    A special kind of Agent that can select Artworks, define a thematic,
    setup everything in the space and write a catalog.

 Exhibition

    An Event that is organised by a Curator.

 Gallery

    Just another kind of Place, mostly commercial.

    Since it implements the Buyer role, a gallery can both acquire() and
    sell().

 Idea

    When some abstractions starts to become something in the mind of an
    Agent

 Institution

    A Place that came out of the Underground.

 Magazine

 Museum

    Yet another kind of Place, an institution with a lot of Artworks in the
    basement.

 Opening

 Place

    A `Place` must `invite()` all kind of `Agents` that produce `Work` or
    other kind of valuable social interactions. Depending of the total
    `reputation` of the `Place` it will determine it's `underground`
    status: when going out of the `underground`, it will become an
    institution.

 Playground

    A generic space where Art::World Agents can do all kind of weird
    things.

 Public

 School

 Sex

 Squat

    A place were art world agents are doing things. A squat that is not
    underground anymore become an institution.

 Theory

    When some abstract concept turns to some said or written stuff.

 Website

 Work

    There are not only Artworks. All Agents produce various kind of work or
    help consuming or implementing Art.

 Workshop

    A specific kind of Playground where you can build things tranquilly.

META UTILS

    A couple of utilities that makes a sort of meta-programming very
    simple. It is more like a reminder for my bad memory than something
    very interesting. Largely inspired by this Perl Monks thread
    <https://www.perlmonks.org/?node_id=1043195>.

      Art::World::Meta->get_all_attributes( $artist );
      # ==>  ( 'id', 'name', 'reputation', 'artworks', 'collectors', 'collected', 'status' )

 get_class( Object $klass )

    Returns the class of the object.

 get_set_attributes_only( Object $clazz )

    Returns only attributes that are set for a particular object.

 get_all_attributes( Object $claxx )

    Returns even non-set attributes for a particular object.

AUTHORS

    Sébastien Feugère <sebastien@feugere.net>

 ACKNOWLEDGEMENTS

    Thanks to everyone who has contributed to ack in any way, including
    Adrien Lucca, Toby Inkster, Ezgi Göç, Pierre Aubert, Seb.
    Hu-Rillettes, Joseph Balicki, Nicolas Herubel and Nadia Boursin-Piraud.

    This project was made possible by the greatness of Zydeco
    <https://zydeco.toby.ink/>.

COPYRIGHT AND LICENSE

    Copyright 2006-2021 Sebastien Feugère

    This library is free software; you can redistribute it and/or modify it
    under the Artistic License 2.0.

