| line | stmt | bran | cond | sub | pod | time | code | 
| 1 | 15 |  |  | 15 |  | 1610704 | use 5.20.0; | 
|  | 15 |  |  |  |  | 205 |  | 
| 2 | 15 |  |  | 15 |  | 91 | use strict; | 
|  | 15 |  |  |  |  | 30 |  | 
|  | 15 |  |  |  |  | 395 |  | 
| 3 | 15 |  |  | 15 |  | 77 | use warnings; | 
|  | 15 |  |  |  |  | 27 |  | 
|  | 15 |  |  |  |  | 1306 |  | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | package Art::World { | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | our $VERSION = '0.18_18'; | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | use Zydeco | 
| 10 | 15 |  |  |  |  | 282 | authority => 'cpan:SMONFF', | 
| 11 |  |  |  |  |  |  | # Predeclaration of types avoid use of quotes in args types declarations or | 
| 12 |  |  |  |  |  |  | # signatures. See https://codeberg.org/smonff/art-world/issues/37 | 
| 13 |  |  |  |  |  |  | declare => [ | 
| 14 |  |  |  |  |  |  | 'Agent', | 
| 15 |  |  |  |  |  |  | 'Artwork', | 
| 16 |  |  |  |  |  |  | 'Collector', | 
| 17 |  |  |  |  |  |  | 'Idea', | 
| 18 |  |  |  |  |  |  | 'Place', | 
| 19 |  |  |  |  |  |  | 'Theory', | 
| 20 |  |  |  |  |  |  | ], | 
| 21 | 15 |  |  | 15 |  | 11469 | version   => $VERSION; | 
|  | 15 |  |  |  |  | 5892272 |  | 
| 22 |  |  |  |  |  |  |  | 
| 23 | 15 |  |  | 15 |  | 527296 | use feature qw( postderef ); | 
|  | 15 |  |  |  |  | 104 |  | 
|  | 15 |  |  |  |  | 661 |  | 
| 24 | 15 |  |  | 15 |  | 97 | no warnings qw( experimental::postderef ); | 
|  | 15 |  |  |  |  | 34 |  | 
|  | 15 |  |  |  |  | 723 |  | 
| 25 | 15 |  |  | 15 |  | 107 | use Carp qw( carp cluck ); | 
|  | 15 |  |  |  |  | 30 |  | 
|  | 15 |  |  |  |  | 1074 |  | 
| 26 | 15 |  |  | 15 |  | 96 | use utf8; | 
|  | 15 |  |  |  |  | 31 |  | 
|  | 15 |  |  |  |  | 139 |  | 
| 27 | 15 |  |  | 15 |  | 10780 | use Config::Tiny; | 
|  | 15 |  |  |  |  | 15681 |  | 
|  | 15 |  |  |  |  | 654 |  | 
| 28 | 15 |  |  | 15 |  | 112 | use List::Util qw( max any ); | 
|  | 15 |  |  |  |  | 30 |  | 
|  | 15 |  |  |  |  | 1163 |  | 
| 29 | 15 |  |  | 15 |  | 7917 | use Math::Round; | 
|  | 15 |  |  |  |  | 17180 |  | 
|  | 15 |  |  |  |  | 997 |  | 
| 30 | 15 |  |  | 15 |  | 121 | use Try::Tiny; | 
|  | 15 |  |  |  |  | 35 |  | 
|  | 15 |  |  |  |  | 2062 |  | 
| 31 |  |  |  |  |  |  |  | 
| 32 | 15 |  |  | 15 |  | 666332 | role Abstraction { | 
|  | 15 |  |  |  |  | 44 |  | 
|  | 15 |  |  |  |  | 207 |  | 
|  | 15 |  |  |  |  | 387 |  | 
| 33 | 15 |  |  |  |  | 138 | has discourse ( type => Str ); | 
| 34 | 15 |  |  |  |  | 612 | # TODO should only be a table in the database | 
| 35 | 15 |  |  |  |  | 151 | has file! ( type => ArrayRef[ Idea ], ); | 
|  | 15 |  |  |  |  | 55852 |  | 
| 36 | 15 |  |  |  |  | 119 | has idea! ( type => Str, is => rw,  trigger => true ); | 
|  | 15 |  |  |  |  | 441 |  | 
| 37 | 15 |  |  |  |  | 147 | has process ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 442 |  | 
| 38 | 15 |  |  |  |  | 82 | has project ( type => Str ); | 
|  | 15 |  |  |  |  | 302 |  | 
| 39 | 15 |  |  |  |  | 145 | has time ( type => Int ); | 
| 40 | 15 |  |  |  |  | 314 | # Here should exist all the possible interractions of Concept entities | 
| 41 |  |  |  |  |  |  | method initiate_process { | 
| 42 | 0 |  | 0 | 0 | 0 | 0 | return $self->idea; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 43 | 0 |  |  |  |  | 0 | } | 
|  | 15 |  |  |  |  | 350 |  | 
| 44 | 15 |  |  |  |  | 206 | method insert_to_file {} | 
| 45 | 15 |  |  |  |  | 274 | # etc. | 
| 46 | 15 |  | 0 | 0 | 0 | 135 | method _trigger_idea { | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 47 | 3 |  | 33 | 3 |  | 11 | push $self->file->@*, $self->idea; | 
|  | 3 |  |  |  |  | 18 |  | 
|  | 3 |  |  |  |  | 5 |  | 
|  | 3 |  |  |  |  | 18839 |  | 
| 48 | 3 |  |  |  |  | 96 | } | 
| 49 | 15 |  |  | 15 |  | 8685241 | } | 
|  | 15 |  |  | 15 |  | 45 |  | 
|  | 15 |  |  |  |  | 247 |  | 
|  | 15 |  |  |  |  | 135 |  | 
|  | 15 |  |  |  |  | 6499 |  | 
|  | 15 |  |  |  |  | 215 |  | 
|  | 15 |  |  |  |  | 64 |  | 
| 50 |  |  |  |  |  |  |  | 
| 51 | 15 |  |  | 15 |  | 21125 | role Active { | 
|  | 15 |  |  |  |  | 34 |  | 
|  | 15 |  |  |  |  | 227 |  | 
|  | 15 |  |  |  |  | 261 |  | 
| 52 |  |  |  |  |  |  | method participate { | 
| 53 | 0 |  | 0 | 0 | 0 | 0 | say "That's interesting"; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 54 | 0 |  |  |  |  | 0 | } | 
| 55 | 15 |  |  | 15 |  | 17231 | } | 
|  | 15 |  |  | 15 |  | 31 |  | 
|  | 15 |  |  |  |  | 157 |  | 
|  | 15 |  |  |  |  | 139 |  | 
|  | 15 |  |  |  |  | 5456 |  | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 69 |  | 
| 56 |  |  |  |  |  |  |  | 
| 57 | 15 |  |  | 15 |  | 40100 | role Buyer { | 
|  | 15 |  |  |  |  | 35 |  | 
|  | 15 |  |  |  |  | 108 |  | 
| 58 | 15 |  |  |  |  | 401 |  | 
| 59 | 15 |  |  |  |  | 100 | requires money; | 
| 60 | 15 |  |  |  |  | 494 |  | 
| 61 |  |  |  |  |  |  | multi method acquire ( Artwork $art ) { | 
| 62 | 4 |  | 33 |  |  | 22504 | $self->pay( $art, $self ); | 
|  | 4 |  |  |  |  | 35 |  | 
|  | 4 |  |  |  |  | 216 |  | 
| 63 | 4 |  |  |  |  | 30 | $art->change_owner( $self ); | 
| 64 | 4 |  |  |  |  | 188 | } | 
| 65 | 15 |  |  | 15 |  | 4655648 | } | 
|  | 15 |  |  | 15 |  | 51 |  | 
|  | 15 |  |  |  |  | 281 |  | 
|  | 15 |  |  |  |  | 249 |  | 
|  | 15 |  |  |  |  | 7911 |  | 
|  | 15 |  |  |  |  | 37 |  | 
|  | 15 |  |  |  |  | 66 |  | 
| 66 |  |  |  |  |  |  |  | 
| 67 | 15 |  |  | 15 |  | 69612 | role Collective { | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 106 |  | 
|  | 15 |  |  |  |  | 366 |  | 
| 68 | 15 |  |  |  |  | 142 | has members! ( type => ArrayRef[ Object ] ); | 
|  | 15 |  |  |  |  | 11431 |  | 
| 69 |  |  |  |  |  |  | multi method acquire ( Artwork *art, Collective *collective ) { | 
| 70 | 2 |  | 33 |  |  | 5543 | for my $member ( $arg->collective->members->@* ) { | 
|  | 2 |  |  |  |  | 10 |  | 
|  | 2 |  |  |  |  | 5 |  | 
| 71 | 2 |  |  |  |  | 15 | $member->pay( $arg->art, $arg->collective ); | 
| 72 | 4 |  |  |  |  | 68 | } | 
| 73 |  |  |  |  |  |  | $arg->art->change_owner( $arg->collective ); | 
| 74 | 2 |  |  |  |  | 100 | } | 
| 75 | 15 |  |  | 15 |  | 1674797 | } | 
|  | 15 |  |  | 15 |  | 42 |  | 
|  | 15 |  |  |  |  | 258 |  | 
|  | 15 |  |  |  |  | 249 |  | 
|  | 15 |  |  |  |  | 7013 |  | 
|  | 15 |  |  |  |  | 38 |  | 
|  | 15 |  |  |  |  | 65 |  | 
| 76 |  |  |  |  |  |  |  | 
| 77 |  |  |  |  |  |  | # Dunno how but the fact of being collected should bump artist reputation | 
| 78 | 15 |  |  | 15 |  | 254998 | role Collectionable { | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 142 |  | 
|  | 15 |  |  |  |  | 377 |  | 
| 79 |  |  |  |  |  |  | has owner ( | 
| 80 | 15 |  | 33 |  |  | 155 | lazy    => true, | 
|  | 1 |  |  |  |  | 8643 |  | 
|  | 1 |  |  |  |  | 7 |  | 
|  | 1 |  |  |  |  | 21 |  | 
| 81 |  |  |  |  |  |  | is      => rw, | 
| 82 |  |  |  |  |  |  | clearer => true, | 
| 83 |  |  |  |  |  |  | writer  => 'set_owner', | 
| 84 | 15 |  |  |  |  | 20676 | type    => ArrayRef[ Agent ]) = $self->creator; | 
| 85 | 15 |  |  |  |  | 115 | has value  ( is   => rw ); | 
|  | 15 |  |  |  |  | 347 |  | 
| 86 |  |  |  |  |  |  | has status ( | 
| 87 | 15 |  |  |  |  | 124 | enum            => ['for_sale', 'sold'], | 
| 88 |  |  |  |  |  |  | # Create a delegated method for each value in the enumeration | 
| 89 |  |  |  |  |  |  | handles         => 1, | 
| 90 |  |  |  |  |  |  | default         => 'for_sale' ); | 
| 91 | 15 |  |  |  |  | 309 |  | 
| 92 |  |  |  |  |  |  | method $remove_from_seller_collection { | 
| 93 |  |  |  |  |  |  | my $meta = Art::World::Util->new_meta; | 
| 94 | 6 |  | 33 |  |  | 17 | # Removal of the to-be-sold Artwork in seller collection | 
|  | 6 |  |  |  |  | 23 |  | 
|  | 6 |  |  |  |  | 11 |  | 
| 95 | 6 |  |  |  |  | 175 | for my $owner ( $self->owner->@* ) { | 
| 96 |  |  |  |  |  |  | # Artists don't have a collection | 
| 97 | 6 |  |  |  |  | 257 | # Or maybe they can... So we should add a specific case | 
| 98 |  |  |  |  |  |  | if (  $meta->get_class( $owner ) !~ '^Art::World::Artist$' ) { | 
| 99 |  |  |  |  |  |  | while ( my ( $i, $art ) = each( $owner->collection->@* )) { | 
| 100 | 9 | 100 |  |  |  | 131 | if ( $art->title =~ $self->title ) { | 
| 101 | 8 |  |  |  |  | 258 | # Wish I would use List::UtilsBy extract_by() for this | 
| 102 | 5 | 100 |  |  |  | 167 | splice $owner->collection->@*, $i, 1; | 
| 103 |  |  |  |  |  |  | } | 
| 104 | 3 |  |  |  |  | 53 | } | 
| 105 |  |  |  |  |  |  | } | 
| 106 |  |  |  |  |  |  | } | 
| 107 |  |  |  |  |  |  | } | 
| 108 | 15 |  |  |  |  | 28 |  | 
| 109 | 15 |  |  |  |  | 387 | multi method change_owner ( Collector $buyer ) { | 
|  | 15 |  |  |  |  | 320 |  | 
| 110 |  |  |  |  |  |  |  | 
| 111 | 4 |  | 33 |  |  | 24107 | # From seller collection | 
|  | 4 |  |  |  |  | 24 |  | 
|  | 4 |  |  |  |  | 10 |  | 
| 112 |  |  |  |  |  |  | $self->$remove_from_seller_collection; | 
| 113 |  |  |  |  |  |  |  | 
| 114 | 4 |  |  |  |  | 23 | $self->clear_owner; | 
| 115 |  |  |  |  |  |  | $self->set_owner([ $buyer ]); | 
| 116 | 4 |  |  |  |  | 119 | push $buyer->collection->@*, $self; | 
| 117 | 4 |  |  |  |  | 100 | # TODO guess it should bump some people reputation and artwork aura now | 
| 118 | 4 |  |  |  |  | 272 | } | 
| 119 | 15 |  |  |  |  | 480 |  | 
| 120 | 15 |  |  |  |  | 228 | multi method change_owner ( Coinvestor $buyers ) { | 
| 121 |  |  |  |  |  |  |  | 
| 122 | 2 |  | 33 |  |  | 905 | # From Collector point of view | 
|  | 2 |  |  |  |  | 11 |  | 
|  | 2 |  |  |  |  | 3 |  | 
| 123 |  |  |  |  |  |  | $self->$remove_from_seller_collection; | 
| 124 |  |  |  |  |  |  |  | 
| 125 | 2 |  |  |  |  | 8 | # From Artwork point of view | 
| 126 |  |  |  |  |  |  | $self->clear_owner; | 
| 127 |  |  |  |  |  |  | $self->set_owner( $buyers->members ); | 
| 128 | 2 |  |  |  |  | 59 | push $buyers->collection->@*, $self; | 
| 129 | 2 |  |  |  |  | 47 | # TODO guess it should bump some people reputation and artwork aura now | 
| 130 | 2 |  |  |  |  | 120 | } | 
| 131 |  |  |  |  |  |  |  | 
| 132 | 15 |  |  | 15 |  | 4543710 | } | 
|  | 15 |  |  | 15 |  | 43 |  | 
|  | 15 |  |  |  |  | 265 |  | 
|  | 15 |  |  |  |  | 144 |  | 
|  | 15 |  |  |  |  | 6837 |  | 
|  | 15 |  |  |  |  | 42 |  | 
|  | 15 |  |  |  |  | 140 |  | 
| 133 |  |  |  |  |  |  |  | 
| 134 | 15 |  |  | 15 |  | 215642 | role Crud { | 
|  | 15 |  |  |  |  | 38 |  | 
|  | 15 |  |  |  |  | 125 |  | 
|  | 15 |  |  |  |  | 368 |  | 
| 135 | 15 |  |  |  |  | 163 | has dbh! ( type => InstanceOf[ 'Art::World::Model' ], builder => true, lazy => true ); | 
|  | 15 |  |  |  |  | 72694 |  | 
| 136 | 15 |  |  |  |  | 167 | has db!  ( type => HashRef[ Str ], builder => true, lazy => true ); | 
| 137 | 15 |  |  |  |  | 43007 |  | 
| 138 |  |  |  |  |  |  | method insert ( Str $table, HashRef $attributes ) { | 
| 139 |  |  |  |  |  |  | # TODO IT MUST BE TESTED | 
| 140 | 100 |  | 33 | 100 | 0 | 353 | unless ( $self->does( 'Art::World::Unserializable' )) { | 
|  | 100 |  | 66 |  |  | 403 |  | 
|  | 100 |  |  |  |  | 197 |  | 
|  | 100 |  |  |  |  | 1505218 |  | 
|  | 100 |  |  |  |  | 476 |  | 
|  | 100 |  |  |  |  | 3127 |  | 
|  | 100 |  |  |  |  | 2402 |  | 
| 141 |  |  |  |  |  |  | try { | 
| 142 | 100 | 50 |  |  |  | 496 | my $row = $self->dbh->insert( ucfirst lc $table, $attributes); | 
| 143 |  |  |  |  |  |  | } catch { | 
| 144 |  |  |  |  |  |  | cluck 'You tried to insert to ' . $table . ' but this table doesn\'t exist'; | 
| 145 | 100 |  |  |  |  | 3936 | } | 
| 146 |  |  |  |  |  |  | } | 
| 147 |  |  |  |  |  |  | } | 
| 148 | 15 |  |  |  |  | 362 |  | 
| 149 | 15 |  |  |  |  | 358 | method _build_dbh { | 
| 150 |  |  |  |  |  |  | use DBI; | 
| 151 | 3 |  | 33 | 3 |  | 10 | use Teng; | 
|  | 3 |  |  |  |  | 16 |  | 
|  | 3 |  |  |  |  | 7 |  | 
|  | 3 |  |  |  |  | 110 |  | 
| 152 | 15 |  |  | 15 |  | 3452032 | use Teng::Schema::Loader; | 
|  | 15 |  |  |  |  | 233661 |  | 
|  | 15 |  |  |  |  | 1386 |  | 
| 153 | 15 |  |  | 15 |  | 10201 | my $dbh = Teng::Schema::Loader->load( | 
|  | 15 |  |  |  |  | 631835 |  | 
|  | 15 |  |  |  |  | 839 |  | 
| 154 | 15 |  |  | 15 |  | 7875 | dbh       => DBI->connect( | 
|  | 15 |  |  |  |  | 129408 |  | 
|  | 15 |  |  |  |  | 2658 |  | 
| 155 |  |  |  |  |  |  | 'dbi:' . $self->db->{ kind } . | 
| 156 |  |  |  |  |  |  | ':dbname=' . $self->db->{ name }, | 
| 157 |  |  |  |  |  |  | '', '' ), | 
| 158 |  |  |  |  |  |  | namespace => __PACKAGE__ . '::Model' | 
| 159 | 3 |  |  |  |  | 77 | ); | 
| 160 |  |  |  |  |  |  | return $dbh; | 
| 161 |  |  |  |  |  |  | } | 
| 162 | 3 |  |  |  |  | 69314 |  | 
|  | 15 |  |  |  |  | 268 |  | 
| 163 | 15 |  |  |  |  | 202 | method _build_db { | 
| 164 | 3 |  | 33 | 3 |  | 9 | return { | 
|  | 3 |  |  |  |  | 13 |  | 
|  | 3 |  |  |  |  | 441 |  | 
|  | 3 |  |  |  |  | 49 |  | 
| 165 |  |  |  |  |  |  | name => $self->config->{ DB }->{ NAME }, | 
| 166 |  |  |  |  |  |  | kind => $self->config->{ DB }->{ KIND }, | 
| 167 |  |  |  |  |  |  | }; | 
| 168 | 3 |  |  |  |  | 129 | } | 
| 169 | 15 |  |  | 15 |  | 39308 | } | 
|  | 15 |  |  | 15 |  | 44 |  | 
|  | 15 |  |  |  |  | 243 |  | 
|  | 15 |  |  |  |  | 150 |  | 
|  | 15 |  |  |  |  | 6732 |  | 
|  | 15 |  |  |  |  | 43 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 170 |  |  |  |  |  |  |  | 
| 171 | 15 |  |  | 15 |  | 71042 | role Event { | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 116 |  | 
|  | 15 |  |  |  |  | 427 |  | 
| 172 | 15 |  |  |  |  | 121 | has place ( type => Place ); | 
|  | 15 |  |  |  |  | 3241 |  | 
| 173 | 15 |  |  |  |  | 189 | has datetime ( type => InstanceOf['Time::Moment'] ); | 
| 174 | 15 |  |  |  |  | 9615 | # "guests" | 
| 175 | 15 |  |  |  |  | 117 | has participant ( type => ArrayRef[ Agent ] ); | 
|  | 15 |  |  |  |  | 2701 |  | 
| 176 | 15 |  |  |  |  | 132 | has title ( type => Str, is => ro ); | 
| 177 | 15 |  |  | 15 |  | 4570665 | } | 
|  | 15 |  |  | 15 |  | 44 |  | 
|  | 15 |  |  |  |  | 293 |  | 
|  | 15 |  |  |  |  | 7756 |  | 
|  | 15 |  |  |  |  | 36 |  | 
|  | 15 |  |  |  |  | 84 |  | 
| 178 |  |  |  |  |  |  |  | 
| 179 | 15 |  |  | 15 |  | 62221 | role Exhibit { | 
|  | 15 |  |  |  |  | 44 |  | 
|  | 15 |  |  |  |  | 126 |  | 
|  | 15 |  |  |  |  | 394 |  | 
| 180 | 15 |  |  |  |  | 127 | has public; | 
|  | 15 |  |  |  |  | 546 |  | 
| 181 | 15 |  |  |  |  | 126 | has exhibition ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 521 |  | 
| 182 | 15 |  |  |  |  | 82 | has artist ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 392 |  | 
| 183 | 15 |  |  |  |  | 72 | has artwork ( type => ArrayRef ); | 
| 184 | 15 |  |  |  |  | 366 |  | 
| 185 |  |  |  |  |  |  | method display { | 
| 186 | 0 |  | 0 | 0 | 0 | 0 | say "Shoooow"; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 187 | 0 |  |  |  |  | 0 | } | 
| 188 | 15 |  |  | 15 |  | 4533389 | } | 
|  | 15 |  |  | 15 |  | 48 |  | 
|  | 15 |  |  |  |  | 264 |  | 
|  | 15 |  |  |  |  | 217 |  | 
|  | 15 |  |  |  |  | 7624 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 72 |  | 
| 189 |  |  |  |  |  |  |  | 
| 190 |  |  |  |  |  |  | # TODO If an Agent work is  collected, it's reputation should go up | 
| 191 | 15 |  |  | 15 |  | 168265 | role Fame { | 
|  | 15 |  |  |  |  | 518 |  | 
|  | 15 |  |  |  |  | 135 |  | 
| 192 | 15 |  |  |  |  | 837 | # Private | 
| 193 |  |  |  |  |  |  | method $update_fame( Num $difference ) { | 
| 194 |  |  |  |  |  |  | # Dynamic attribute accessor | 
| 195 | 33 |  | 33 |  |  | 72 | my $attribute = $self->isa( 'Art::World::Work' ) ? | 
|  | 33 |  |  |  |  | 85 |  | 
|  | 33 |  |  |  |  | 54 |  | 
| 196 |  |  |  |  |  |  | 'aura' : 'reputation'; | 
| 197 | 33 | 100 |  |  |  | 233 | if ( $self->can( $attribute )) { | 
| 198 |  |  |  |  |  |  | if ( $self->$attribute + $difference >= 0 ) { | 
| 199 | 33 | 50 |  |  |  | 146 | $self->$attribute( $self->$attribute + $difference ) | 
| 200 | 33 | 100 |  |  |  | 798 | } else { | 
| 201 | 32 |  |  |  |  | 871 | carp 'You tried to update ' . $attribute . ' to a value smaller ' . | 
| 202 |  |  |  |  |  |  | 'than zero. Nothing changed.'; | 
| 203 | 1 |  |  |  |  | 229 | } | 
| 204 |  |  |  |  |  |  | return $self->$attribute; | 
| 205 |  |  |  |  |  |  | } else { | 
| 206 | 33 |  |  |  |  | 1594 | require Art::World::Util; | 
| 207 |  |  |  |  |  |  | carp 'No such attribute ' . $attribute . | 
| 208 | 0 |  |  |  |  | 0 | ' or we don\'t manage this kind of entity ' . Art::World::Util->new_meta->get_class( $self ); | 
| 209 | 0 |  |  |  |  | 0 | } | 
| 210 |  |  |  |  |  |  | } | 
| 211 | 15 |  |  |  |  | 28 |  | 
| 212 | 15 |  |  |  |  | 389 | multi method bump_fame( PositiveNum $gain ) { | 
|  | 15 |  |  |  |  | 345 |  | 
| 213 |  |  |  |  |  |  | $self->$update_fame( $gain ); | 
| 214 | 22 |  | 33 |  |  | 1599 | } | 
|  | 22 |  |  |  |  | 81 |  | 
|  | 22 |  |  |  |  | 35 |  | 
| 215 | 22 |  |  |  |  | 61 |  | 
|  | 15 |  |  |  |  | 640 |  | 
| 216 | 15 |  |  |  |  | 229 | multi method bump_fame( NegativeNum $loss ) { | 
| 217 |  |  |  |  |  |  | $self->$update_fame( $loss ) | 
| 218 | 8 |  | 33 |  |  | 702 | } | 
|  | 8 |  |  |  |  | 32 |  | 
|  | 8 |  |  |  |  | 15 |  | 
| 219 | 8 |  |  |  |  | 19 |  | 
|  | 15 |  |  |  |  | 318 |  | 
| 220 | 15 |  |  |  |  | 168 | multi method bump_fame { | 
| 221 | 3 |  | 33 |  |  | 101 | $self->$update_fame( $self->config->{ FAME }->{ DEFAULT_BUMP }); | 
|  | 3 |  |  |  |  | 16 |  | 
|  | 3 |  |  |  |  | 7 |  | 
| 222 | 3 |  |  |  |  | 91 | } | 
| 223 | 15 |  |  | 15 |  | 1552824 | } | 
|  | 15 |  |  | 15 |  | 44 |  | 
|  | 15 |  |  |  |  | 259 |  | 
|  | 15 |  |  |  |  | 137 |  | 
|  | 33 |  |  |  |  | 37604 |  | 
|  | 15 |  |  |  |  | 7212 |  | 
|  | 15 |  |  |  |  | 37 |  | 
|  | 15 |  |  |  |  | 66 |  | 
| 224 |  |  |  |  |  |  |  | 
| 225 | 15 |  |  | 15 |  | 34404 | role Identity { | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 117 |  | 
|  | 15 |  |  |  |  | 434 |  | 
| 226 | 15 |  |  |  |  | 155 | has id         ( type => Int ); | 
|  | 15 |  |  |  |  | 672 |  | 
| 227 | 15 |  |  |  |  | 119 | has name!      ( type => Str ); | 
| 228 | 15 |  |  | 15 |  | 2316129 | } | 
|  | 15 |  |  | 15 |  | 48 |  | 
|  | 15 |  |  |  |  | 322 |  | 
|  | 15 |  |  |  |  | 8038 |  | 
|  | 15 |  |  |  |  | 36 |  | 
|  | 15 |  |  |  |  | 93 |  | 
| 229 |  |  |  |  |  |  |  | 
| 230 |  |  |  |  |  |  | # From the documentation | 
| 231 |  |  |  |  |  |  | # | 
| 232 |  |  |  |  |  |  | # A `Place` must `invite()` all kind of `Agents` that produce `Work` or other kind | 
| 233 |  |  |  |  |  |  | # of valuable social interactions. Depending of the total `reputation` of the | 
| 234 |  |  |  |  |  |  | # `Place` it will determine it's `underground` status: when going out of the | 
| 235 |  |  |  |  |  |  | # `underground`, it will become an institution. | 
| 236 |  |  |  |  |  |  | # | 
| 237 | 15 |  |  | 15 |  | 24215 | role Invitation { | 
|  | 15 |  |  |  |  | 36 |  | 
|  | 15 |  |  |  |  | 146 |  | 
| 238 | 15 |  |  |  |  | 325 | # In case a group of Agents are invited, for an Event like a performance, a concert | 
| 239 |  |  |  |  |  |  | multi method invite ( ArrayRef[ Agent ] *people,  Event *event  ) { | 
| 240 | 0 |  | 0 |  |  | 0 | } | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 241 | 15 |  |  | 15 |  | 29730 | } | 
|  | 15 |  |  | 15 |  | 41 |  | 
|  | 15 |  |  |  |  | 196 |  | 
|  | 15 |  |  |  |  | 249 |  | 
|  | 15 |  |  |  |  | 6772 |  | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 75 |  | 
| 242 |  |  |  |  |  |  |  | 
| 243 |  |  |  |  |  |  | # The idea here is producing discourse about art | 
| 244 | 15 |  |  | 15 |  | 23018 | role Language { | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 116 |  | 
|  | 15 |  |  |  |  | 371 |  | 
| 245 |  |  |  |  |  |  | method speak ( Str $paroles) { | 
| 246 | 0 |  | 0 | 0 | 0 | 0 | say $paroles; | 
|  | 0 |  | 0 |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 247 | 0 |  |  |  |  | 0 | # TODO Could write to a log file | 
| 248 |  |  |  |  |  |  | } | 
| 249 | 15 |  |  | 15 |  | 482331 | } | 
|  | 15 |  |  | 15 |  | 43 |  | 
|  | 15 |  |  |  |  | 257 |  | 
|  | 15 |  |  |  |  | 242 |  | 
|  | 15 |  |  |  |  | 7960 |  | 
|  | 15 |  |  |  |  | 35 |  | 
|  | 15 |  |  |  |  | 71 |  | 
| 250 |  |  |  |  |  |  |  | 
| 251 | 15 |  |  | 15 |  | 49174 | role Manager { | 
|  | 15 |  |  |  |  | 43 |  | 
|  | 15 |  |  |  |  | 131 |  | 
|  | 15 |  |  |  |  | 424 |  | 
| 252 | 15 |  |  |  |  | 116 | has places ( type => ArrayRef[ Place ] ); | 
| 253 | 15 |  |  |  |  | 19763 |  | 
| 254 |  |  |  |  |  |  | method organize {} | 
| 255 | 15 |  |  |  |  | 369 |  | 
| 256 | 15 |  | 0 | 0 | 0 | 262 | method influence ( Int $reputation) { | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 257 | 7 |  | 33 | 7 | 0 | 21 | return $self->config->{ FAME }->{ MANAGER_BUMP } * $reputation; | 
|  | 7 |  | 66 |  |  | 24 |  | 
|  | 7 |  |  |  |  | 14 |  | 
|  | 7 |  |  |  |  | 754 |  | 
|  | 7 |  |  |  |  | 52 |  | 
|  | 7 |  |  |  |  | 1919 |  | 
|  | 7 |  |  |  |  | 132 |  | 
| 258 | 7 |  |  |  |  | 190 | } | 
| 259 | 15 |  |  | 15 |  | 1677653 | } | 
|  | 15 |  |  | 15 |  | 47 |  | 
|  | 15 |  |  |  |  | 305 |  | 
|  | 15 |  |  |  |  | 180 |  | 
|  | 15 |  |  |  |  | 6831 |  | 
|  | 15 |  |  |  |  | 49 |  | 
|  | 15 |  |  |  |  | 79 |  | 
| 260 |  |  |  |  |  |  |  | 
| 261 | 15 |  |  | 15 |  | 117671 | role Market { | 
|  | 15 |  |  |  |  | 43 |  | 
|  | 15 |  |  |  |  | 131 |  | 
| 262 | 15 |  |  |  |  | 388 |  | 
| 263 | 15 |  |  |  |  | 161 | has money! ( type => Num, is => rw, default => 0 ); | 
| 264 |  |  |  |  |  |  |  | 
| 265 | 15 |  |  |  |  | 676 | # Can be a personal collector or a Coinvestor | 
| 266 |  |  |  |  |  |  | method pay ( Artwork $piece, Collector $collector  ) { | 
| 267 | 8 |  | 33 | 8 | 0 | 27 | # Divide what must be paid by each buyer | 
|  | 8 |  | 66 |  |  | 32 |  | 
|  | 8 |  |  |  |  | 16 |  | 
|  | 8 |  |  |  |  | 254 |  | 
|  | 8 |  |  |  |  | 69 |  | 
|  | 8 |  |  |  |  | 3868 |  | 
|  | 8 |  |  |  |  | 160 |  | 
| 268 |  |  |  |  |  |  | my $must_give = Art::World::Util | 
| 269 | 8 | 100 |  |  |  | 235 | ->new_meta | 
| 270 |  |  |  |  |  |  | ->get_class( $collector ) !~ /^Art::World::Coinvestor$/ ? | 
| 271 |  |  |  |  |  |  | $piece->value : | 
| 272 |  |  |  |  |  |  | $piece->value / scalar $collector->members->@*; | 
| 273 |  |  |  |  |  |  |  | 
| 274 |  |  |  |  |  |  | # The money must be divided in equal between all owners | 
| 275 |  |  |  |  |  |  | my $part =  $must_give / scalar $piece->owner->@*; | 
| 276 | 8 |  |  |  |  | 210 | # Seller(s) got their money given | 
| 277 |  |  |  |  |  |  | map { $_->money( $_->money + $part ) } $piece->owner->@*; | 
| 278 | 8 |  |  |  |  | 201 | # Buyer gives the money | 
|  | 12 |  |  |  |  | 386 |  | 
| 279 |  |  |  |  |  |  | $self->money( $self->money - $must_give ); | 
| 280 | 8 |  |  |  |  | 378 | } | 
| 281 | 15 |  |  | 15 |  | 2213633 | } | 
|  | 15 |  |  | 15 |  | 49 |  | 
|  | 15 |  |  |  |  | 277 |  | 
|  | 15 |  |  |  |  | 265 |  | 
|  | 15 |  |  |  |  | 7699 |  | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 78 |  | 
| 282 |  |  |  |  |  |  |  | 
| 283 | 15 |  |  | 15 |  | 21362 | role Showable { | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 112 |  | 
| 284 | 15 |  |  |  |  | 292 | #requires exhibition; | 
| 285 |  |  |  |  |  |  | method exhibit { | 
| 286 | 0 |  | 0 | 0 | 0 | 0 | say "Show"; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 287 | 0 |  |  |  |  | 0 | } | 
| 288 | 15 |  |  | 15 |  | 17611 | } | 
|  | 15 |  |  | 15 |  | 39 |  | 
|  | 15 |  |  |  |  | 186 |  | 
|  | 15 |  |  |  |  | 192 |  | 
|  | 15 |  |  |  |  | 6117 |  | 
|  | 15 |  |  |  |  | 49 |  | 
|  | 15 |  |  |  |  | 80 |  | 
| 289 |  |  |  |  |  |  |  | 
| 290 | 15 |  |  | 15 |  | 13614 | role Space { | 
|  | 15 |  |  |  |  | 42 |  | 
|  | 15 |  |  |  |  | 106 |  | 
| 291 |  |  |  |  |  |  | # Like a small space or a large space | 
| 292 | 15 |  |  |  |  | 409 | # Could limit the number of person coming during an event for example | 
| 293 | 15 |  |  |  |  | 108 | has space; | 
| 294 | 15 |  |  | 15 |  | 1180087 | } | 
|  | 15 |  |  | 15 |  | 56 |  | 
|  | 15 |  |  |  |  | 577 |  | 
|  | 15 |  |  |  |  | 8014 |  | 
|  | 15 |  |  |  |  | 42 |  | 
|  | 15 |  |  |  |  | 75 |  | 
| 295 |  |  |  |  |  |  |  | 
| 296 | 15 |  |  | 15 |  | 21193 | role Underground { | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 116 |  | 
|  | 15 |  |  |  |  | 305 |  | 
| 297 |  |  |  |  |  |  | method experiment { | 
| 298 | 0 |  | 0 | 0 | 0 | 0 | say "Underground"; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 299 | 0 |  |  |  |  | 0 | } | 
| 300 | 15 |  |  | 15 |  | 17972 | } | 
|  | 15 |  |  | 15 |  | 39 |  | 
|  | 15 |  |  |  |  | 191 |  | 
|  | 15 |  |  |  |  | 222 |  | 
|  | 15 |  |  |  |  | 6242 |  | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 98 |  | 
| 301 |  |  |  |  |  |  |  | 
| 302 | 15 |  |  | 15 |  | 15554 | role Writing { | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 117 |  | 
|  | 15 |  |  |  |  | 346 |  | 
| 303 |  |  |  |  |  |  | method write ( Theory $concepts ) {} | 
| 304 | 15 |  | 0 | 15 | 0 | 474366 | } | 
|  | 15 |  | 0 | 15 |  | 47 |  | 
|  | 15 |  |  | 0 |  | 240 |  | 
|  | 15 |  |  |  |  | 283 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 15 |  |  |  |  | 7078 |  | 
|  | 15 |  |  |  |  | 52 |  | 
|  | 15 |  |  |  |  | 83 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 305 |  |  |  |  |  |  |  | 
| 306 | 15 |  |  | 15 |  | 1434295 | class Art { | 
|  | 15 |  |  |  |  | 44 |  | 
|  | 15 |  |  |  |  | 176 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 307 | 15 |  |  |  |  | 248 |  | 
| 308 |  |  |  |  |  |  | has config ( | 
| 309 |  |  |  |  |  |  | is => ro, | 
| 310 |  |  |  |  |  |  | lazy => true, | 
| 311 | 4 |  |  |  |  | 81 | default => sub { Config::Tiny->read( './art.conf' )} | 
| 312 | 15 |  |  |  |  | 178 | ); | 
| 313 |  |  |  |  |  |  |  | 
| 314 |  |  |  |  |  |  | # TODO an implemented project (Work, Exhibition) should inherit of this | 
| 315 | 15 |  |  |  |  | 391 | # TODO some stuff should extends this | 
| 316 | 15 |  |  | 15 |  | 1693283 | abstract class Concept { | 
|  | 15 |  |  |  |  | 45 |  | 
|  | 15 |  |  |  |  | 167 |  | 
|  | 15 |  |  |  |  | 309 |  | 
|  | 15 |  |  |  |  | 31 |  | 
| 317 | 15 |  |  | 15 |  | 1444381 | class Idea  with Abstraction { } | 
|  | 15 |  |  | 15 |  | 53 |  | 
|  | 15 |  |  | 15 |  | 184 |  | 
|  | 15 |  |  |  |  | 2156 |  | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 260 |  | 
|  | 15 |  |  |  |  | 460 |  | 
|  | 15 |  |  |  |  | 561 |  | 
|  | 15 |  |  |  |  | 7621 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 77 |  | 
|  | 15 |  |  |  |  | 35 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 318 | 15 |  |  | 15 |  | 11292 | class Theory  with Abstraction { } | 
|  | 15 |  |  | 15 |  | 37 |  | 
|  | 15 |  |  | 15 |  | 142 |  | 
|  | 15 |  |  |  |  | 1536 |  | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 155 |  | 
|  | 15 |  |  |  |  | 286 |  | 
|  | 15 |  |  |  |  | 375 |  | 
|  | 15 |  |  |  |  | 5245 |  | 
|  | 15 |  |  |  |  | 38 |  | 
|  | 15 |  |  |  |  | 80 |  | 
| 319 | 15 |  |  | 15 |  | 956 | } | 
|  | 15 |  |  | 15 |  | 37 |  | 
|  | 15 |  |  |  |  | 153 |  | 
|  | 15 |  |  |  |  | 382 |  | 
|  | 15 |  |  |  |  | 5257 |  | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 78 |  | 
| 320 | 15 |  |  |  |  | 29 |  | 
| 321 | 15 |  |  | 15 |  | 48070 | class Opening with Event, Fame { | 
|  | 15 |  |  |  |  | 45 |  | 
|  | 15 |  |  |  |  | 126 |  | 
|  | 15 |  |  |  |  | 462 |  | 
|  | 15 |  |  |  |  | 36 |  | 
| 322 | 15 |  |  |  |  | 599 | has treat ( type => ArrayRef[ Str ]); | 
|  | 15 |  |  |  |  | 140 |  | 
|  | 15 |  |  |  |  | 11580 |  | 
| 323 | 15 |  |  |  |  | 113 | has smalltalk; | 
| 324 |  |  |  |  |  |  |  | 
| 325 | 15 |  |  |  |  | 287 | # TODO must take as parameter what is served | 
| 326 |  |  |  |  |  |  | method serve { | 
| 327 | 1 |  | 33 | 1 | 0 | 4 | return $self->treat->@*; | 
|  | 1 |  |  |  |  | 5 |  | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 7029 |  | 
| 328 | 1 |  |  |  |  | 14 | } | 
| 329 | 15 |  |  | 15 |  | 2337487 | } | 
|  | 15 |  |  | 15 |  | 49 |  | 
|  | 15 |  |  |  |  | 272 |  | 
|  | 15 |  |  |  |  | 214 |  | 
|  | 15 |  |  |  |  | 7459 |  | 
|  | 15 |  |  |  |  | 47 |  | 
|  | 15 |  |  |  |  | 77 |  | 
| 330 |  |  |  |  |  |  |  | 
| 331 | 15 |  |  |  |  | 33 | # TODO Guess this is more like an Agent method or role | 
| 332 | 15 |  |  | 15 |  | 7991 | class Sex with Event; | 
|  | 15 |  |  | 15 |  | 49 |  | 
|  | 15 |  |  | 15 |  | 111 |  | 
|  | 15 |  |  |  |  | 1565 |  | 
|  | 15 |  |  |  |  | 36 |  | 
|  | 15 |  |  |  |  | 160 |  | 
|  | 15 |  |  |  |  | 293 |  | 
|  | 15 |  |  |  |  | 383 |  | 
|  | 15 |  |  |  |  | 5338 |  | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 70 |  | 
| 333 | 15 |  |  |  |  | 31 |  | 
| 334 | 15 |  |  | 15 |  | 176145 | class Playground with Crud, Identity { | 
|  | 15 |  |  |  |  | 49 |  | 
|  | 15 |  |  |  |  | 140 |  | 
|  | 15 |  |  |  |  | 288 |  | 
| 335 | 15 |  |  |  |  | 35 |  | 
| 336 | 15 |  |  | 15 |  | 37538 | class Magazine { | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 113 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 337 | 15 |  |  |  |  | 399 |  | 
| 338 | 15 |  |  |  |  | 124 | has reader; | 
|  | 15 |  |  |  |  | 523 |  | 
| 339 | 15 |  |  |  |  | 97 | has writer ( type => ArrayRef[ Agent ] ); | 
| 340 | 15 |  |  |  |  | 4170 |  | 
| 341 | 15 |  | 0 | 0 | 0 | 215 | method publish {}; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 342 | 15 |  |  | 15 |  | 2315613 | } | 
|  | 15 |  |  | 15 |  | 50 |  | 
|  | 15 |  |  |  |  | 265 |  | 
|  | 15 |  |  |  |  | 7379 |  | 
|  | 15 |  |  |  |  | 44 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 343 | 15 |  |  |  |  | 27 |  | 
| 344 | 15 |  |  | 15 |  | 136461 | class Place with Fame, Invitation, Space { | 
|  | 15 |  |  |  |  | 57 |  | 
|  | 15 |  |  |  |  | 131 |  | 
|  | 15 |  |  |  |  | 299 |  | 
| 345 |  |  |  |  |  |  |  | 
| 346 | 15 |  |  |  |  | 30 | # Like, dunno, a city ? Could be in a Geo role I guess | 
| 347 | 15 |  |  |  |  | 155 | has location ( type => Str ); | 
|  | 0 |  |  |  |  | 0 |  | 
| 348 | 15 |  |  |  |  | 407 |  | 
| 349 | 15 |  |  | 15 |  | 1262380 | class Institution with Market { | 
|  | 15 |  |  |  |  | 51 |  | 
|  | 15 |  |  |  |  | 154 |  | 
|  | 15 |  |  |  |  | 340 |  | 
|  | 15 |  |  |  |  | 34 |  | 
| 350 | 15 |  |  | 15 |  | 52133 | class Gallery with Exhibit, Buyer { | 
|  | 15 |  |  |  |  | 52 |  | 
|  | 15 |  |  |  |  | 112 |  | 
|  | 15 |  |  |  |  | 566 |  | 
|  | 15 |  |  |  |  | 36 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 351 | 15 |  |  |  |  | 581 | has artwork ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 140 |  | 
|  | 15 |  |  |  |  | 650 |  | 
| 352 | 15 |  |  |  |  | 80 | has artist ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 413 |  | 
| 353 | 15 |  |  |  |  | 95 | has event ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 392 |  | 
| 354 | 15 |  |  |  |  | 81 | has owner; | 
| 355 | 15 |  |  | 15 |  | 4527870 | } | 
|  | 15 |  |  | 15 |  | 47 |  | 
|  | 15 |  |  |  |  | 316 |  | 
|  | 15 |  |  |  |  | 8205 |  | 
|  | 15 |  |  |  |  | 44 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 356 | 15 |  |  |  |  | 24 |  | 
| 357 | 15 |  |  | 15 |  | 11761 | class Museum with Exhibit, Buyer; | 
|  | 15 |  |  | 15 |  | 47 |  | 
|  | 15 |  |  | 15 |  | 144 |  | 
|  | 15 |  |  |  |  | 1664 |  | 
|  | 15 |  |  |  |  | 58 |  | 
|  | 15 |  |  |  |  | 155 |  | 
|  | 15 |  |  |  |  | 300 |  | 
|  | 15 |  |  |  |  | 403 |  | 
|  | 15 |  |  |  |  | 5611 |  | 
|  | 15 |  |  |  |  | 47 |  | 
|  | 15 |  |  |  |  | 77 |  | 
| 358 | 15 |  |  |  |  | 33 |  | 
| 359 | 15 |  |  | 15 |  | 44160 | class School { | 
|  | 15 |  |  |  |  | 49 |  | 
|  | 15 |  |  |  |  | 130 |  | 
| 360 | 15 |  |  |  |  | 422 | # TODO much underground | 
| 361 | 15 |  |  |  |  | 111 | has student  ( type => ArrayRef[ Agent ]); | 
| 362 | 15 |  |  |  |  | 4483 | # TODO Should enforce a minimum reputation | 
| 363 | 15 |  |  |  |  | 108 | has teachers ( type => ArrayRef[ Agent ]);; | 
| 364 | 15 |  |  | 15 |  | 2278421 | } | 
|  | 15 |  |  | 15 |  | 52 |  | 
|  | 15 |  |  |  |  | 290 |  | 
|  | 15 |  |  |  |  | 10751 |  | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 88 |  | 
| 365 | 15 |  |  | 15 |  | 1245 | } | 
|  | 15 |  |  | 15 |  | 41 |  | 
|  | 15 |  |  |  |  | 714 |  | 
|  | 15 |  |  |  |  | 443 |  | 
|  | 15 |  |  |  |  | 5433 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 69 |  | 
| 366 | 15 |  |  |  |  | 32 |  | 
| 367 | 15 |  |  | 15 |  | 8151 | class Squat with Underground; | 
|  | 15 |  |  | 15 |  | 38 |  | 
|  | 15 |  |  | 15 |  | 128 |  | 
|  | 15 |  |  |  |  | 1672 |  | 
|  | 15 |  |  |  |  | 44 |  | 
|  | 15 |  |  |  |  | 155 |  | 
|  | 15 |  |  |  |  | 289 |  | 
|  | 15 |  |  |  |  | 379 |  | 
|  | 15 |  |  |  |  | 5279 |  | 
|  | 15 |  |  |  |  | 79 |  | 
|  | 15 |  |  |  |  | 74 |  | 
|  | 15 |  |  |  |  | 38 |  | 
| 368 | 15 |  |  | 15 |  | 4817 | class Workshop; | 
|  | 15 |  |  | 15 |  | 38 |  | 
|  | 15 |  |  | 15 |  | 101 |  | 
|  | 15 |  |  |  |  | 1693 |  | 
|  | 15 |  |  |  |  | 33 |  | 
|  | 15 |  |  |  |  | 191 |  | 
|  | 15 |  |  |  |  | 5192 |  | 
|  | 15 |  |  |  |  | 33 |  | 
|  | 15 |  |  |  |  | 70 |  | 
| 369 |  |  |  |  |  |  |  | 
| 370 | 15 |  |  | 15 |  | 1090 | } | 
|  | 15 |  |  | 15 |  | 34 |  | 
|  | 15 |  |  |  |  | 148 |  | 
|  | 15 |  |  |  |  | 379 |  | 
|  | 15 |  |  |  |  | 5612 |  | 
|  | 15 |  |  |  |  | 37 |  | 
|  | 15 |  |  |  |  | 66 |  | 
| 371 | 15 |  |  |  |  | 50 |  | 
| 372 | 15 |  |  | 15 |  | 4903 | class Website; | 
|  | 15 |  |  | 15 |  | 37 |  | 
|  | 15 |  |  | 15 |  | 97 |  | 
|  | 15 |  |  |  |  | 1389 |  | 
|  | 15 |  |  |  |  | 37 |  | 
|  | 15 |  |  |  |  | 177 |  | 
|  | 15 |  |  |  |  | 5041 |  | 
|  | 15 |  |  |  |  | 34 |  | 
|  | 15 |  |  |  |  | 70 |  | 
| 373 |  |  |  |  |  |  |  | 
| 374 | 15 |  |  | 15 |  | 1060 | } | 
|  | 15 |  |  | 15 |  | 33 |  | 
|  | 15 |  |  |  |  | 153 |  | 
|  | 15 |  |  |  |  | 492 |  | 
|  | 15 |  |  |  |  | 5121 |  | 
|  | 15 |  |  |  |  | 37 |  | 
|  | 15 |  |  |  |  | 71 |  | 
| 375 | 15 |  |  |  |  | 31 |  | 
| 376 | 15 |  |  | 15 |  | 534455 | class Agent with Active, Crud, Fame, Identity { | 
|  | 15 |  |  |  |  | 49 |  | 
|  | 15 |  |  |  |  | 153 |  | 
|  | 15 |  |  |  |  | 298 |  | 
| 377 | 15 |  |  |  |  | 40 |  | 
| 378 | 15 |  |  |  |  | 161 | has reputation ( is => rw, type => PositiveOrZeroNum ); | 
|  | 0 |  |  |  |  | 0 |  | 
| 379 |  |  |  |  |  |  |  | 
| 380 |  |  |  |  |  |  | # TODO Should be done during an event | 
| 381 |  |  |  |  |  |  | # TODO In case the networker is a Manager, the reputation bump | 
| 382 | 15 |  |  |  |  | 440 | # should be higher | 
| 383 |  |  |  |  |  |  | method networking( ArrayRef $people ) { | 
| 384 |  |  |  |  |  |  |  | 
| 385 | 3 |  | 33 | 3 | 0 | 13 | $self->dbh; | 
|  | 3 |  | 66 |  |  | 23 |  | 
|  | 3 |  |  |  |  | 193 |  | 
|  | 3 |  |  |  |  | 15063 |  | 
|  | 3 |  |  |  |  | 44 |  | 
|  | 3 |  |  |  |  | 2561 |  | 
|  | 3 |  |  |  |  | 47 |  | 
| 386 |  |  |  |  |  |  | my $highest_reputation = max map { $_-> reputation } $people->@*; | 
| 387 | 3 |  |  |  |  | 294 | my $bump = $highest_reputation > 1 ? | 
| 388 | 3 |  |  |  |  | 101 | round( $highest_reputation * $self->config->{ FAME }->{ BUMP_COEFFICIENT } / 100) : | 
|  | 9 |  |  |  |  | 221 |  | 
| 389 |  |  |  |  |  |  | $self->config->{ FAME }->{ DEFAULT_BUMP }; | 
| 390 |  |  |  |  |  |  | for my $agent ( $people->@* ) { | 
| 391 | 3 | 50 |  |  |  | 91 | $agent->bump_fame( $bump ); | 
| 392 | 3 |  |  |  |  | 125 | } | 
| 393 | 9 |  |  |  |  | 239 |  | 
| 394 |  |  |  |  |  |  | if ( any { $_->does( 'Art::World::Manager' ) } $people->@* ) { | 
| 395 |  |  |  |  |  |  | my @managers = grep { $_->does( 'Art::World::Manager' )} $people->@*; | 
| 396 | 3 | 50 |  |  |  | 59 | my $highest_influence_manager    =  max map { $self } @managers; | 
|  | 7 |  |  |  |  | 146 |  | 
| 397 | 3 |  |  |  |  | 68 | # Bump all the other persons with the Manager->influence thing | 
|  | 9 |  |  |  |  | 133 |  | 
| 398 | 3 |  |  |  |  | 43 | # but not the Manager with the highest influence otherwise it would | 
|  | 4 |  |  |  |  | 20 |  | 
| 399 |  |  |  |  |  |  | # increase it's own reputation | 
| 400 |  |  |  |  |  |  | my @all_the_other = grep { $_->id != $highest_influence_manager->id } $people->@*; | 
| 401 |  |  |  |  |  |  | for my $agent ( @all_the_other ) { | 
| 402 | 3 |  |  |  |  | 7 | # The influence() methode is only a way of bumping_fame() with a special bumper | 
|  | 9 |  |  |  |  | 52 |  | 
| 403 | 3 |  |  |  |  | 10 | $agent->bump_fame( $highest_influence_manager->influence( $agent->reputation )); | 
| 404 |  |  |  |  |  |  | } | 
| 405 | 6 |  |  |  |  | 134 | } | 
| 406 |  |  |  |  |  |  | } | 
| 407 | 15 |  |  |  |  | 362 |  | 
| 408 | 15 |  |  | 15 |  | 2012125 | class Artist with Market { | 
|  | 15 |  |  |  |  | 43 |  | 
|  | 15 |  |  |  |  | 166 |  | 
|  | 15 |  |  |  |  | 498 |  | 
|  | 15 |  |  |  |  | 650 |  | 
| 409 | 15 |  |  |  |  | 36 |  | 
| 410 | 15 |  |  |  |  | 640 | has artworks   ( type => ArrayRef ); | 
|  | 15 |  |  |  |  | 169 |  | 
|  | 15 |  |  |  |  | 666 |  | 
| 411 | 15 |  |  |  |  | 132 | has collectors ( type => ArrayRef[ Collector ], default => sub { [] }); | 
|  | 108 |  |  |  |  | 96678 |  | 
|  | 15 |  |  |  |  | 21358 |  | 
| 412 | 15 |  |  |  |  | 188 | has collected  ( type => Bool, default => false, is => rw ); | 
|  | 15 |  |  |  |  | 432 |  | 
| 413 |  |  |  |  |  |  | has status ( | 
| 414 |  |  |  |  |  |  | enum => [ 'underground', 'homogenic' ], | 
| 415 |  |  |  |  |  |  | # Create a delegated method for each value in the enumeration | 
| 416 |  |  |  |  |  |  | handles => 1, | 
| 417 |  |  |  |  |  |  | default => sub { | 
| 418 | 111 |  |  |  |  | 22394 | my $self = shift; | 
| 419 | 15 | 100 |  |  |  | 147 | $self->has_collectors ? 'homogenic' : 'underground' }); | 
|  | 111 |  |  |  |  | 314 |  | 
| 420 | 15 |  |  |  |  | 313 |  | 
| 421 |  |  |  |  |  |  | method create { | 
| 422 |  |  |  |  |  |  | say $self->name . " create !"; | 
| 423 | 0 |  | 0 | 0 | 0 | 0 | } | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 424 | 0 |  |  |  |  | 0 |  | 
|  | 15 |  |  |  |  | 440 |  | 
| 425 | 15 |  |  |  |  | 254 | method have_idea { | 
| 426 |  |  |  |  |  |  | say $self->name . ' have shitty idea' if true; | 
| 427 | 0 |  | 0 | 0 | 0 | 0 | } | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 428 | 0 |  |  |  |  | 0 |  | 
|  | 15 |  |  |  |  | 280 |  | 
| 429 | 15 |  |  |  |  | 176 | method perform {} | 
| 430 |  |  |  |  |  |  |  | 
| 431 |  |  |  |  |  |  | # factory underground_artist does underground | 
| 432 | 15 |  |  |  |  | 267 |  | 
| 433 | 15 |  | 0 | 0 | 0 | 172 | method has_collectors { | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 434 | 111 |  | 33 | 111 | 0 | 177 | if ( scalar $self->collectors->@* > 1 ) { | 
|  | 111 |  |  |  |  | 309 |  | 
|  | 111 |  |  |  |  | 164 |  | 
|  | 111 |  |  |  |  | 315 |  | 
| 435 | 111 | 100 |  |  |  | 2667 | $self->collected( true ); | 
| 436 | 3 |  |  |  |  | 97 | } | 
| 437 |  |  |  |  |  |  | } | 
| 438 | 15 |  |  | 15 |  | 4832774 | } | 
|  | 15 |  |  | 15 |  | 48 |  | 
|  | 15 |  |  |  |  | 291 |  | 
|  | 15 |  |  |  |  | 142 |  | 
|  | 15 |  |  |  |  | 7197 |  | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 439 | 15 |  |  |  |  | 35 |  | 
| 440 | 15 |  |  | 15 |  | 64358 | class Collector with Active, Buyer, Market { | 
|  | 15 |  |  |  |  | 51 |  | 
|  | 15 |  |  |  |  | 147 |  | 
|  | 15 |  |  |  |  | 292 |  | 
|  | 15 |  |  |  |  | 35 |  | 
| 441 | 0 |  |  |  |  | 0 | has collection ( | 
| 442 |  |  |  |  |  |  | type    => ArrayRef[ Artwork, 0 ], | 
| 443 | 11 |  |  |  |  | 46369 | default => sub { [] }, | 
| 444 | 15 |  |  |  |  | 104 | is      => rw, ); | 
|  | 15 |  |  |  |  | 20726 |  | 
| 445 | 15 |  |  | 15 |  | 1190519 | class Coinvestor with Collective { | 
|  | 15 |  |  |  |  | 43 |  | 
|  | 15 |  |  |  |  | 153 |  | 
|  | 15 |  |  |  |  | 432 |  | 
| 446 |  |  |  |  |  |  | # TODO the Coinvestor money should be automatically build from all the investors | 
| 447 | 15 |  |  | 15 |  | 2092 | } | 
|  | 15 |  |  | 15 |  | 39 |  | 
|  | 15 |  |  |  |  | 231 |  | 
|  | 15 |  |  |  |  | 579 |  | 
|  | 15 |  |  |  |  | 7310 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 448 | 15 |  |  | 15 |  | 1060 | } | 
|  | 15 |  |  | 15 |  | 34 |  | 
|  | 15 |  |  |  |  | 168 |  | 
|  | 15 |  |  |  |  | 435 |  | 
|  | 15 |  |  |  |  | 5734 |  | 
|  | 15 |  |  |  |  | 60 |  | 
|  | 15 |  |  |  |  | 86 |  | 
| 449 | 15 |  |  |  |  | 29 |  | 
| 450 | 15 |  |  | 15 |  | 13172 | class Critic with Language, Writing {}; | 
|  | 15 |  |  | 15 |  | 51 |  | 
|  | 15 |  |  | 15 |  | 104 |  | 
|  | 15 |  |  |  |  | 1712 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 164 |  | 
|  | 15 |  |  |  |  | 311 |  | 
|  | 15 |  |  |  |  | 422 |  | 
|  | 15 |  |  |  |  | 5298 |  | 
|  | 15 |  |  |  |  | 130 |  | 
|  | 15 |  |  |  |  | 77 |  | 
| 451 | 15 |  |  |  |  | 31 |  | 
| 452 | 15 |  |  | 15 |  | 62974 | class Curator with Manager, Writing { | 
|  | 15 |  |  |  |  | 52 |  | 
|  | 15 |  |  |  |  | 131 |  | 
|  | 15 |  |  |  |  | 476 |  | 
|  | 15 |  |  |  |  | 31 |  | 
| 453 | 15 |  |  |  |  | 571 | has exhibition( type  => ArrayRef ); | 
|  | 15 |  |  |  |  | 149 |  | 
|  | 15 |  |  |  |  | 634 |  | 
| 454 |  |  |  |  |  |  | method select( Artwork $art ) { | 
| 455 | 0 |  | 0 | 0 | 0 | 0 | push $self->exhibition->@*, $art; | 
|  | 0 |  | 0 |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 456 | 0 |  |  |  |  | 0 | } | 
|  | 15 |  |  |  |  | 386 |  | 
| 457 | 15 |  |  |  |  | 284 | method define( Theory $thematic ) { } | 
|  | 15 |  |  |  |  | 275 |  | 
| 458 | 15 |  | 0 | 0 | 0 | 181 | method setup( Place $space ) { } | 
|  | 0 |  | 0 |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 15 |  |  |  |  | 277 |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 459 | 15 |  | 0 | 0 | 0 | 156 | method write( Theory $catalog ) { } | 
|  | 0 |  | 0 |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 460 | 15 |  | 0 | 15 | 0 | 3036257 | } | 
|  | 15 |  | 0 | 15 |  | 50 |  | 
|  | 15 |  |  | 0 |  | 286 |  | 
|  | 15 |  |  |  |  | 138 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 15 |  |  |  |  | 7815 |  | 
|  | 15 |  |  |  |  | 43 |  | 
|  | 15 |  |  |  |  | 73 |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
|  | 0 |  |  |  |  |  |  | 
| 461 | 15 |  |  |  |  | 24 |  | 
| 462 | 15 |  |  | 15 |  | 7889 | class Director with Manager; | 
|  | 15 |  |  | 15 |  | 103 |  | 
|  | 15 |  |  | 15 |  | 119 |  | 
|  | 15 |  |  |  |  | 1641 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 172 |  | 
|  | 15 |  |  |  |  | 297 |  | 
|  | 15 |  |  |  |  | 388 |  | 
|  | 15 |  |  |  |  | 5448 |  | 
|  | 15 |  |  |  |  | 37 |  | 
|  | 15 |  |  |  |  | 82 |  | 
| 463 | 15 |  |  |  |  | 39 |  | 
| 464 | 15 |  |  | 15 |  | 22792 | class Public with Unserializable? { | 
|  | 15 |  |  |  |  | 40 |  | 
|  | 15 |  |  |  |  | 116 |  | 
|  | 15 |  |  |  |  | 334 |  | 
|  | 15 |  |  |  |  | 32 |  | 
| 465 | 15 |  |  |  |  | 434 | method visit { | 
| 466 | 0 |  | 0 | 0 | 0 | 0 | say "I visited"; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  |  |  | 
| 467 | 0 |  |  |  |  | 0 | } | 
| 468 | 15 |  |  | 15 |  | 17404 | } | 
|  | 15 |  |  | 15 |  | 54 |  | 
|  | 15 |  |  |  |  | 186 |  | 
|  | 15 |  |  |  |  | 166 |  | 
|  | 15 |  |  |  |  | 6270 |  | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 139 |  | 
| 469 |  |  |  |  |  |  | #use Art::Behavior::Crudable; | 
| 470 |  |  |  |  |  |  | # does Art::Behavior::Crudable; | 
| 471 |  |  |  |  |  |  | # has relations | 
| 472 | 15 |  |  | 15 |  | 1228 | } | 
|  | 15 |  |  | 15 |  | 35 |  | 
|  | 15 |  |  |  |  | 165 |  | 
|  | 15 |  |  |  |  | 402 |  | 
|  | 15 |  |  |  |  | 5314 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 86 |  | 
| 473 |  |  |  |  |  |  |  | 
| 474 |  |  |  |  |  |  |  | 
| 475 | 15 |  |  | 15 |  | 130311 | class Work extends Concept with Fame { | 
|  | 15 |  |  |  |  | 47 |  | 
|  | 15 |  |  |  |  | 140 |  | 
|  | 15 |  |  |  |  | 319 |  | 
|  | 15 |  |  |  |  | 484 |  | 
| 476 | 15 |  |  |  |  | 36 |  | 
| 477 | 15 |  |  |  |  | 103 | has creation_date; | 
|  | 15 |  |  |  |  | 317 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 478 |  |  |  |  |  |  | has creator!( | 
| 479 | 15 |  |  |  |  | 107 | is   => ro, | 
| 480 |  |  |  |  |  |  | type => ArrayRef[ Agent ] ); | 
| 481 | 15 |  |  |  |  | 12823 |  | 
| 482 |  |  |  |  |  |  | has title( | 
| 483 | 15 |  |  |  |  | 165 | is   => ro, | 
| 484 |  |  |  |  |  |  | type => Str ); | 
| 485 |  |  |  |  |  |  |  | 
| 486 | 15 |  |  |  |  | 356 | # Same as Agent->reputation | 
| 487 | 15 |  |  |  |  | 173 | has aura( is => rw, type => PositiveOrZeroNum ); | 
| 488 | 15 |  |  |  |  | 338 |  | 
| 489 | 15 |  |  | 15 |  | 4612434 | class Article | 
|  | 15 |  |  | 15 |  | 54 |  | 
|  | 15 |  |  | 15 |  | 155 |  | 
|  | 15 |  |  |  |  | 1875 |  | 
|  | 15 |  |  |  |  | 39 |  | 
|  | 15 |  |  |  |  | 242 |  | 
|  | 15 |  |  |  |  | 7253 |  | 
|  | 15 |  |  |  |  | 51 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 490 | 15 |  |  |  |  | 37 |  | 
| 491 | 15 |  |  | 15 |  | 22565 | class Artwork with Showable, Collectionable  { | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 115 |  | 
|  | 15 |  |  |  |  | 483 |  | 
|  | 15 |  |  |  |  | 32 |  | 
| 492 | 15 |  |  |  |  | 613 | has material; | 
|  | 15 |  |  |  |  | 124 |  | 
|  | 15 |  |  |  |  | 393 |  | 
| 493 | 15 |  |  |  |  | 81 | has size; | 
| 494 | 15 |  |  | 15 |  | 2268739 | } | 
|  | 15 |  |  | 15 |  | 49 |  | 
|  | 15 |  |  |  |  | 297 |  | 
|  | 15 |  |  |  |  | 8102 |  | 
|  | 15 |  |  |  |  | 45 |  | 
|  | 15 |  |  |  |  | 78 |  | 
| 495 | 15 |  |  |  |  | 31 |  | 
| 496 | 15 |  |  | 15 |  | 5247 | class Book; | 
|  | 15 |  |  | 15 |  | 44 |  | 
|  | 15 |  |  | 15 |  | 112 |  | 
|  | 15 |  |  |  |  | 1386 |  | 
|  | 15 |  |  |  |  | 42 |  | 
|  | 15 |  |  |  |  | 177 |  | 
|  | 15 |  |  |  |  | 5165 |  | 
|  | 15 |  |  |  |  | 51 |  | 
|  | 15 |  |  |  |  | 78 |  | 
| 497 |  |  |  |  |  |  |  | 
| 498 |  |  |  |  |  |  | # BUG doesn't have the Work attributes. | 
| 499 | 15 |  |  |  |  | 44 | # Multiple inheritance is not fine | 
| 500 | 15 |  |  | 15 |  | 34886 | class Exhibition with Event { | 
|  | 15 |  |  |  |  | 45 |  | 
|  | 15 |  |  |  |  | 116 |  | 
|  | 15 |  |  |  |  | 475 |  | 
|  | 15 |  |  |  |  | 39 |  | 
| 501 | 15 |  |  |  |  | 582 | has curator! ( | 
| 502 | 15 |  |  |  |  | 100 | is   => ro, | 
| 503 |  |  |  |  |  |  | type => ArrayRef[ Curator ] ); | 
| 504 | 15 |  |  | 15 |  | 1167844 | } | 
|  | 15 |  |  | 15 |  | 53 |  | 
|  | 15 |  |  |  |  | 325 |  | 
|  | 15 |  |  |  |  | 28287 |  | 
|  | 15 |  |  |  |  | 46 |  | 
|  | 15 |  |  |  |  | 74 |  | 
| 505 | 15 |  |  | 15 |  | 1340 | } | 
|  | 15 |  |  | 15 |  | 37 |  | 
|  | 15 |  |  |  |  | 168 |  | 
|  | 15 |  |  |  |  | 437 |  | 
|  | 15 |  |  |  |  | 5244 |  | 
|  | 15 |  |  |  |  | 41 |  | 
|  | 15 |  |  |  |  | 73 |  | 
| 506 | 15 |  |  | 15 |  | 910 | } | 
|  | 15 |  |  | 15 |  | 38 |  | 
|  | 15 |  |  |  |  | 169 |  | 
|  | 15 |  |  |  |  | 5165 |  | 
|  | 15 |  |  |  |  | 45 |  | 
|  | 15 |  |  |  |  | 69 |  | 
| 507 |  |  |  |  |  |  | } | 
| 508 |  |  |  |  |  |  |  | 
| 509 |  |  |  |  |  |  | 1; | 
| 510 |  |  |  |  |  |  | __END__ | 
| 511 |  |  |  |  |  |  |  | 
| 512 |  |  |  |  |  |  | =encoding UTF-8 | 
| 513 |  |  |  |  |  |  |  | 
| 514 |  |  |  |  |  |  | =head1 NAME | 
| 515 |  |  |  |  |  |  |  | 
| 516 |  |  |  |  |  |  | Art::World - Modeling of creative processes | 
| 517 |  |  |  |  |  |  |  | 
| 518 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 519 |  |  |  |  |  |  |  | 
| 520 |  |  |  |  |  |  | use Art::World; | 
| 521 |  |  |  |  |  |  |  | 
| 522 |  |  |  |  |  |  | my $artwork = Art::World->new_artwork( | 
| 523 |  |  |  |  |  |  | creator => [ $artist, $another_artist ]  , | 
| 524 |  |  |  |  |  |  | owner   => 'smonff' | 
| 525 |  |  |  |  |  |  | title   => 'Corrupted art institutions likes critical art' | 
| 526 |  |  |  |  |  |  | value   => 100, ); | 
| 527 |  |  |  |  |  |  |  | 
| 528 |  |  |  |  |  |  | my $museum = Art::World->new_museum( | 
| 529 |  |  |  |  |  |  | money => 1000, | 
| 530 |  |  |  |  |  |  | name  => 'Contemporary Museum of Art::World' | 
| 531 |  |  |  |  |  |  | ); | 
| 532 |  |  |  |  |  |  |  | 
| 533 |  |  |  |  |  |  | $museum->acquire( $artwork ); | 
| 534 |  |  |  |  |  |  |  | 
| 535 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 536 |  |  |  |  |  |  |  | 
| 537 |  |  |  |  |  |  | C<Art::World> is an attempt to model and simulate a system describing the | 
| 538 |  |  |  |  |  |  | interactions and influences between the various I<agents> of the art world. | 
| 539 |  |  |  |  |  |  |  | 
| 540 |  |  |  |  |  |  | It tries to draw a schematization of the interactions between art, institutions, | 
| 541 |  |  |  |  |  |  | influences and unexpected parameters during the social processes of artistic | 
| 542 |  |  |  |  |  |  | creation. | 
| 543 |  |  |  |  |  |  |  | 
| 544 |  |  |  |  |  |  | More informations about the purposes and aims of this project can be found in | 
| 545 |  |  |  |  |  |  | it's L<Art::World::Manual>. Especially, the | 
| 546 |  |  |  |  |  |  | L<HISTORY|Art::World::Manual/"HISTORY"> and the | 
| 547 |  |  |  |  |  |  | L<OBJECTIVES|Art::World::Manual/"OBJECTIVES"> section could be very handy to | 
| 548 |  |  |  |  |  |  | understand how this is an artwork using programming. | 
| 549 |  |  |  |  |  |  |  | 
| 550 |  |  |  |  |  |  | =head1 MOTIVATIONS | 
| 551 |  |  |  |  |  |  |  | 
| 552 |  |  |  |  |  |  | This project is a self-teaching experiment around the modern Perl | 
| 553 |  |  |  |  |  |  | object-oriented programming toolkit. In late 2020, I read a bit about | 
| 554 |  |  |  |  |  |  | L<Corrina|https://github.com/Ovid/Cor/wiki> and immediatly wanted to restart and | 
| 555 |  |  |  |  |  |  | experiment my old C<Art::World> project. While searching for something somewhat | 
| 556 |  |  |  |  |  |  | close to Corrina, since Corrina was only a draft and RFC, I discovered the | 
| 557 |  |  |  |  |  |  | Zydeco toolkit by Toby Inkster and immediatly felt very enthusiastic to use it | 
| 558 |  |  |  |  |  |  | to implement my idea. I hope it is a decent example of the possibilities this | 
| 559 |  |  |  |  |  |  | wonderful framework make possible. | 
| 560 |  |  |  |  |  |  |  | 
| 561 |  |  |  |  |  |  | It is possible that this toolkit may be used by an art management software as it | 
| 562 |  |  |  |  |  |  | could be needed in an art galery or a museum. | 
| 563 |  |  |  |  |  |  |  | 
| 564 |  |  |  |  |  |  | =head1 ROLES | 
| 565 |  |  |  |  |  |  |  | 
| 566 |  |  |  |  |  |  | =head2 Abstraction | 
| 567 |  |  |  |  |  |  |  | 
| 568 |  |  |  |  |  |  | This is were all kind of weird phenomenons between abstract artistic entities happen. See the | 
| 569 |  |  |  |  |  |  | L<Manual|Art::World::Manual> about how it works. | 
| 570 |  |  |  |  |  |  |  | 
| 571 |  |  |  |  |  |  | =head2 Active | 
| 572 |  |  |  |  |  |  |  | 
| 573 |  |  |  |  |  |  | Is used to dissociate behaviors belonging to performers as opposed to the | 
| 574 |  |  |  |  |  |  | public. Provide a C<participate> method. | 
| 575 |  |  |  |  |  |  |  | 
| 576 |  |  |  |  |  |  | =head2 Buyer | 
| 577 |  |  |  |  |  |  |  | 
| 578 |  |  |  |  |  |  | All this behavior and attributes are encapsulated in the C<Buyer> role because | 
| 579 |  |  |  |  |  |  | there is no such thing as somebody in the art world that buy but doesn't sale. | 
| 580 |  |  |  |  |  |  |  | 
| 581 |  |  |  |  |  |  | The C<aquire> method is requiring some C<money>. The C<money> is provided by the | 
| 582 |  |  |  |  |  |  | C<Market> role. | 
| 583 |  |  |  |  |  |  |  | 
| 584 |  |  |  |  |  |  | $collector->acquire({ art => $artwork }); | 
| 585 |  |  |  |  |  |  |  | 
| 586 |  |  |  |  |  |  | Those behaviors are delegated to the private C<$change_owner()> method, and to | 
| 587 |  |  |  |  |  |  | the C<pay()> method from the C<Market> role. | 
| 588 |  |  |  |  |  |  |  | 
| 589 |  |  |  |  |  |  | When a C<Collector> C<acquire()> an C<Artwork>, the C<Artwork> C<ArrayRef> of | 
| 590 |  |  |  |  |  |  | owners is automatically cleared and substituted by the new owner(s). | 
| 591 |  |  |  |  |  |  | C<acquire()> will remove the value of the C<Artwork> from the owner's money. | 
| 592 |  |  |  |  |  |  |  | 
| 593 |  |  |  |  |  |  | $artwork->change_owner({ buyer => $sef }); | 
| 594 |  |  |  |  |  |  |  | 
| 595 |  |  |  |  |  |  | When the paiement occurs, the money is allocated to all the artwork owners | 
| 596 |  |  |  |  |  |  | involved and removed from the buyer's fortune. | 
| 597 |  |  |  |  |  |  |  | 
| 598 |  |  |  |  |  |  | $self->pay( $artwork ); | 
| 599 |  |  |  |  |  |  |  | 
| 600 |  |  |  |  |  |  | =head2 Collectionable | 
| 601 |  |  |  |  |  |  |  | 
| 602 |  |  |  |  |  |  | The C<collectionnable> provide a series of attributes. | 
| 603 |  |  |  |  |  |  |  | 
| 604 |  |  |  |  |  |  | If it's collectionable, it can go to a C<Collector> collection or in a | 
| 605 |  |  |  |  |  |  | C<Museum>. A collectionable item is automatically owned by it's creator. | 
| 606 |  |  |  |  |  |  |  | 
| 607 |  |  |  |  |  |  | =head2 Collective | 
| 608 |  |  |  |  |  |  |  | 
| 609 |  |  |  |  |  |  | They do stuff together. You know, art is not about lonely C<Artists> in their | 
| 610 |  |  |  |  |  |  | C<Workshop>. | 
| 611 |  |  |  |  |  |  |  | 
| 612 |  |  |  |  |  |  | This has first been designed for collectors, but could be used to | 
| 613 |  |  |  |  |  |  | activate any kind of collective behavior. | 
| 614 |  |  |  |  |  |  |  | 
| 615 |  |  |  |  |  |  | This is quite a problem because what if a group of people wants to buy? We have | 
| 616 |  |  |  |  |  |  | a C<Coinvestor> class implementing the C<Collective> role that provide a | 
| 617 |  |  |  |  |  |  | I<collective-acquirement> method. | 
| 618 |  |  |  |  |  |  |  | 
| 619 |  |  |  |  |  |  | It's C<acquire()> multi method provide a way to collectively buy an item. | 
| 620 |  |  |  |  |  |  | C<Coinvestor> is a class inheriting from C<Collector> that implement the | 
| 621 |  |  |  |  |  |  | C<Collective> role so it would be able to collectively acquire C<Works>. | 
| 622 |  |  |  |  |  |  |  | 
| 623 |  |  |  |  |  |  | Note that the signatures are different between C<Buyer> and C<Collective> roles: | 
| 624 |  |  |  |  |  |  |  | 
| 625 |  |  |  |  |  |  | $collector->acquire({ art => $artwork }); | 
| 626 |  |  |  |  |  |  | # ==> using the method from the Buyer role | 
| 627 |  |  |  |  |  |  |  | 
| 628 |  |  |  |  |  |  | $coinvestors->acquire({ art => $collector->collection->[2], collective => $coinvestors }); | 
| 629 |  |  |  |  |  |  | # ==> using the method from the Collective role | 
| 630 |  |  |  |  |  |  |  | 
| 631 |  |  |  |  |  |  | Just pass a self-reference to the coinvestor object and they will be able to organize and buy together. | 
| 632 |  |  |  |  |  |  |  | 
| 633 |  |  |  |  |  |  | =head2 Crud | 
| 634 |  |  |  |  |  |  |  | 
| 635 |  |  |  |  |  |  | The C<Crud> role makes possible to serialize most of the entities. For this to be | 
| 636 |  |  |  |  |  |  | possible, they need to have a corresponding table in the database, plus they | 
| 637 |  |  |  |  |  |  | need to not have a C<unserializable?> tag attribute. A Zydeco tag role is a role | 
| 638 |  |  |  |  |  |  | without behavior that can only be checked using C<does>. | 
| 639 |  |  |  |  |  |  |  | 
| 640 |  |  |  |  |  |  | The Crud role is made possible thanks to L<Teng>, a simple DBI wrapper and O/R | 
| 641 |  |  |  |  |  |  | Mapper. C<Teng> is used through it's L<schema loader|Teng::Schema::Loader> that | 
| 642 |  |  |  |  |  |  | directly instanciate an object schema from the database. | 
| 643 |  |  |  |  |  |  |  | 
| 644 |  |  |  |  |  |  | When trying to update a value, it is necessary to pass a table name and a | 
| 645 |  |  |  |  |  |  | hashref of attributes. The table name is not case sensitive. | 
| 646 |  |  |  |  |  |  |  | 
| 647 |  |  |  |  |  |  | Note that it is extremely important that the testing of the database should be | 
| 648 |  |  |  |  |  |  | done in the C<t/crud.t> file. If you want to test database or model | 
| 649 |  |  |  |  |  |  | functionnalities in other tests, remind to create objects by specifiying the | 
| 650 |  |  |  |  |  |  | config parameter that use the C<test.conf> file: only the database referenced in | 
| 651 |  |  |  |  |  |  | C<test.conf> will be available on cpantesters and C<art.db> wont be available there, | 
| 652 |  |  |  |  |  |  | only C<t/test.db> is available. | 
| 653 |  |  |  |  |  |  |  | 
| 654 |  |  |  |  |  |  | =head2 Event | 
| 655 |  |  |  |  |  |  |  | 
| 656 |  |  |  |  |  |  | All the necessary attributes and methodes for having fun between Art::world's Agents. | 
| 657 |  |  |  |  |  |  |  | 
| 658 |  |  |  |  |  |  | =head2 Exhibit | 
| 659 |  |  |  |  |  |  |  | 
| 660 |  |  |  |  |  |  | Role for L<C<Places>|Art::World/"Place"> that display some  L<C<Artworks>|Art::World/"Artwork">. | 
| 661 |  |  |  |  |  |  |  | 
| 662 |  |  |  |  |  |  | =head2 Fame | 
| 663 |  |  |  |  |  |  |  | 
| 664 |  |  |  |  |  |  | C<Fame> role provide ways to control the aura and reputation that various | 
| 665 |  |  |  |  |  |  | C<Agents>, C<Places> or C<Works> have. Cannot be negative. | 
| 666 |  |  |  |  |  |  |  | 
| 667 |  |  |  |  |  |  | It has an handy C<bump_fame()> method that I<self-bump> the fame count. It can | 
| 668 |  |  |  |  |  |  | be used in three specific maneers: | 
| 669 |  |  |  |  |  |  |  | 
| 670 |  |  |  |  |  |  | =over 2 | 
| 671 |  |  |  |  |  |  |  | 
| 672 |  |  |  |  |  |  | =item pass a C<PositiveNum> | 
| 673 |  |  |  |  |  |  |  | 
| 674 |  |  |  |  |  |  | The fame will go higher | 
| 675 |  |  |  |  |  |  |  | 
| 676 |  |  |  |  |  |  | =item pass a C<NegativeNum> | 
| 677 |  |  |  |  |  |  |  | 
| 678 |  |  |  |  |  |  | The fame he fame will go lower | 
| 679 |  |  |  |  |  |  |  | 
| 680 |  |  |  |  |  |  | =item no parameter | 
| 681 |  |  |  |  |  |  |  | 
| 682 |  |  |  |  |  |  | In that case the value defined by C<< $self->config->{ FAME }->{ DEFAULT_BUMP } >> | 
| 683 |  |  |  |  |  |  | will be used to increase the reputation. | 
| 684 |  |  |  |  |  |  |  | 
| 685 |  |  |  |  |  |  | =back | 
| 686 |  |  |  |  |  |  |  | 
| 687 |  |  |  |  |  |  | my $artist = Art::World->new_artist( | 
| 688 |  |  |  |  |  |  | reputation => 0.42, | 
| 689 |  |  |  |  |  |  | name => 'Questular Rontok' | 
| 690 |  |  |  |  |  |  | ); | 
| 691 |  |  |  |  |  |  |  | 
| 692 |  |  |  |  |  |  | say $artist->bump_fame;               # ==>  1.42 | 
| 693 |  |  |  |  |  |  | say $artist->bump_fame( 0.0042 );     # ==>  1.4242 | 
| 694 |  |  |  |  |  |  |  | 
| 695 |  |  |  |  |  |  | If you try to update the fame to a negative value, nothing happens and a nice | 
| 696 |  |  |  |  |  |  | warning is displayed. | 
| 697 |  |  |  |  |  |  |  | 
| 698 |  |  |  |  |  |  | The fame can be consummed by pretty much everything. A C<Place> or and C<Agent> | 
| 699 |  |  |  |  |  |  | have a fame through it's reputation, and an C<Artwork> too through it's | 
| 700 |  |  |  |  |  |  | aura. | 
| 701 |  |  |  |  |  |  |  | 
| 702 |  |  |  |  |  |  | Classes that consume C<Fame> can have two different kind of attributes for | 
| 703 |  |  |  |  |  |  | storing the C<Fame>: | 
| 704 |  |  |  |  |  |  |  | 
| 705 |  |  |  |  |  |  | =over 2 | 
| 706 |  |  |  |  |  |  |  | 
| 707 |  |  |  |  |  |  | =item aura | 
| 708 |  |  |  |  |  |  |  | 
| 709 |  |  |  |  |  |  | For C<Works> only. | 
| 710 |  |  |  |  |  |  |  | 
| 711 |  |  |  |  |  |  | =item reputation | 
| 712 |  |  |  |  |  |  |  | 
| 713 |  |  |  |  |  |  | For C<Agents>, C<Places>, etc. | 
| 714 |  |  |  |  |  |  |  | 
| 715 |  |  |  |  |  |  | =back | 
| 716 |  |  |  |  |  |  |  | 
| 717 |  |  |  |  |  |  | =head2 Market | 
| 718 |  |  |  |  |  |  |  | 
| 719 |  |  |  |  |  |  | It is all about offer and demand. Involve C<money>. It provide a C<pay()> method | 
| 720 |  |  |  |  |  |  | that can be using by entities consumming this role. This method accept an | 
| 721 |  |  |  |  |  |  | C<Artwork> as an unique required parameter. | 
| 722 |  |  |  |  |  |  |  | 
| 723 |  |  |  |  |  |  | The C<pay()> method is used by an entity that is designed by C<$self>. | 
| 724 |  |  |  |  |  |  |  | 
| 725 |  |  |  |  |  |  | TODO How many people can buy a thing together? | 
| 726 |  |  |  |  |  |  |  | 
| 727 |  |  |  |  |  |  | =head2 Manager | 
| 728 |  |  |  |  |  |  |  | 
| 729 |  |  |  |  |  |  | A role for those who I<take care> of exhibitions and other organizational | 
| 730 |  |  |  |  |  |  | matters. See how being a C<Manager> influence an C<Agent> in the L<CLASSES> | 
| 731 |  |  |  |  |  |  | section. | 
| 732 |  |  |  |  |  |  |  | 
| 733 |  |  |  |  |  |  | =head2 Showable | 
| 734 |  |  |  |  |  |  |  | 
| 735 |  |  |  |  |  |  | Only an object that does the C<Showable> role can be exhibited. An object should | 
| 736 |  |  |  |  |  |  | be exhibited only if it reached the C<Showable> stage. | 
| 737 |  |  |  |  |  |  |  | 
| 738 |  |  |  |  |  |  | =head1 CLASSES | 
| 739 |  |  |  |  |  |  |  | 
| 740 |  |  |  |  |  |  | =head2 Agent | 
| 741 |  |  |  |  |  |  |  | 
| 742 |  |  |  |  |  |  | They are the activists of the Art World, previously known as the I<Wildlife>. | 
| 743 |  |  |  |  |  |  |  | 
| 744 |  |  |  |  |  |  | my $agent = Art::World->new_agent( name => $f->person_name ); | 
| 745 |  |  |  |  |  |  |  | 
| 746 |  |  |  |  |  |  | $agent->participate;    # ==>  "That's interesting" | 
| 747 |  |  |  |  |  |  |  | 
| 748 |  |  |  |  |  |  | A generic entity that can be any activist of the C<Art::World>. Provides all | 
| 749 |  |  |  |  |  |  | kind of C<Agent> classes and roles. | 
| 750 |  |  |  |  |  |  |  | 
| 751 |  |  |  |  |  |  | The C<Agent> got an a C<networking( $people )> method. When it is passed and | 
| 752 |  |  |  |  |  |  | C<ArrayRef> of various implementation classes of C<Agents> (C<Artist>, | 
| 753 |  |  |  |  |  |  | C<Curator>, etc.) it bumps the C<reputation> attributes of all of 1/10 of the | 
| 754 |  |  |  |  |  |  | C<Agent> with the highest reputation. If this reputation is less than 1, it is | 
| 755 |  |  |  |  |  |  | rounded to the C<< $self->config->{ FAME }->{ DEFAULT_BUMP } >> constant. | 
| 756 |  |  |  |  |  |  |  | 
| 757 |  |  |  |  |  |  | The bump coefficient can be adjusted in the configuration through C<< { FAME }->{ | 
| 758 |  |  |  |  |  |  | BUMP_COEFFICIENT } >>. | 
| 759 |  |  |  |  |  |  |  | 
| 760 |  |  |  |  |  |  | There is also a special way of bumping fame when C<Manager>s are in a Networking | 
| 761 |  |  |  |  |  |  | activity: The C<influence()> method makes possible to apply the special | 
| 762 |  |  |  |  |  |  | C<< $self->config->{ FAME }->{ MANAGER_BUMP } >> constant. Then the C<Agent>s | 
| 763 |  |  |  |  |  |  | reputations are bumped by the C<MANAGER_BUMP> value multiplicated by the highest | 
| 764 |  |  |  |  |  |  | networking C<Manager> reputation. This is what the C<influence()> method | 
| 765 |  |  |  |  |  |  | returns: | 
| 766 |  |  |  |  |  |  |  | 
| 767 |  |  |  |  |  |  | return $self->config->{ FAME }->{ MANAGER_BUMP } * $reputation; | 
| 768 |  |  |  |  |  |  |  | 
| 769 |  |  |  |  |  |  | The default values can be edited in C<art.conf>. | 
| 770 |  |  |  |  |  |  |  | 
| 771 |  |  |  |  |  |  | =head2 Art | 
| 772 |  |  |  |  |  |  |  | 
| 773 |  |  |  |  |  |  | Will be what you decide it to be depending on how you combine all the entities. | 
| 774 |  |  |  |  |  |  |  | 
| 775 |  |  |  |  |  |  | =head2 Article | 
| 776 |  |  |  |  |  |  |  | 
| 777 |  |  |  |  |  |  | Something in a C<Magazine> of C<Website> about C<Art>, C<Exhibitions>, etc. | 
| 778 |  |  |  |  |  |  |  | 
| 779 |  |  |  |  |  |  | =head2 Artist | 
| 780 |  |  |  |  |  |  |  | 
| 781 |  |  |  |  |  |  | In the beginning of their carreer they are usually underground and produce | 
| 782 |  |  |  |  |  |  | experimental art, but this can change in time. | 
| 783 |  |  |  |  |  |  |  | 
| 784 |  |  |  |  |  |  | my $artist = Art::World->new_artist( | 
| 785 |  |  |  |  |  |  | name => 'Andy Cassrol', | 
| 786 |  |  |  |  |  |  | ); | 
| 787 |  |  |  |  |  |  |  | 
| 788 |  |  |  |  |  |  | say $artist->is_homogenic; | 
| 789 |  |  |  |  |  |  | #==> false | 
| 790 |  |  |  |  |  |  |  | 
| 791 |  |  |  |  |  |  |  | 
| 792 |  |  |  |  |  |  | After getting collected, artists become homogenic. | 
| 793 |  |  |  |  |  |  |  | 
| 794 |  |  |  |  |  |  | $artist->is_underground if not $artist->has_collectors; | 
| 795 |  |  |  |  |  |  |  | 
| 796 |  |  |  |  |  |  | The artist got a lots of wonderful powers: | 
| 797 |  |  |  |  |  |  |  | 
| 798 |  |  |  |  |  |  | =over | 
| 799 |  |  |  |  |  |  |  | 
| 800 |  |  |  |  |  |  | =item C<create> | 
| 801 |  |  |  |  |  |  |  | 
| 802 |  |  |  |  |  |  | When the basic abstractions of Art are articulated, a creation occurs. It | 
| 803 |  |  |  |  |  |  | doesn't mean that it will create an C<Artwork>, because it requires the | 
| 804 |  |  |  |  |  |  | intervention of other C<Agents>. The C<Artist> creates through a work concept. | 
| 805 |  |  |  |  |  |  | This articulation can group the different attributes of the C<Abstraction> role: | 
| 806 |  |  |  |  |  |  | C<discourse>, C<file>, C<idea>, C<process>, C<project> and C<time>. | 
| 807 |  |  |  |  |  |  |  | 
| 808 |  |  |  |  |  |  | =item C<have_idea> all day long | 
| 809 |  |  |  |  |  |  |  | 
| 810 |  |  |  |  |  |  | =back | 
| 811 |  |  |  |  |  |  |  | 
| 812 |  |  |  |  |  |  | =head2 Artwork | 
| 813 |  |  |  |  |  |  |  | 
| 814 |  |  |  |  |  |  | The base thing producted by artists. Artwork is subclass of | 
| 815 |  |  |  |  |  |  | L<C<Work>|Art::World#Work> that have a C<Showable> and C<Collectionable> role. | 
| 816 |  |  |  |  |  |  |  | 
| 817 |  |  |  |  |  |  | =head2 Book | 
| 818 |  |  |  |  |  |  |  | 
| 819 |  |  |  |  |  |  | Where a lot of theory is written by C<Critics> | 
| 820 |  |  |  |  |  |  |  | 
| 821 |  |  |  |  |  |  | =head2 Collector | 
| 822 |  |  |  |  |  |  |  | 
| 823 |  |  |  |  |  |  | =head2 Concept | 
| 824 |  |  |  |  |  |  |  | 
| 825 |  |  |  |  |  |  | C<Concept> is an abstract class that does the C<Abstraction> role. | 
| 826 |  |  |  |  |  |  |  | 
| 827 |  |  |  |  |  |  | =head2 Critic | 
| 828 |  |  |  |  |  |  |  | 
| 829 |  |  |  |  |  |  | =head2 Curator | 
| 830 |  |  |  |  |  |  |  | 
| 831 |  |  |  |  |  |  | A special kind of Agent that I<can> select Artworks, define a thematic, setup | 
| 832 |  |  |  |  |  |  | everything in the space and write a catalog. | 
| 833 |  |  |  |  |  |  |  | 
| 834 |  |  |  |  |  |  | =head2 Exhibition | 
| 835 |  |  |  |  |  |  |  | 
| 836 |  |  |  |  |  |  | An C<Event> that is organised by a C<Curator>. | 
| 837 |  |  |  |  |  |  |  | 
| 838 |  |  |  |  |  |  | =head2 Gallery | 
| 839 |  |  |  |  |  |  |  | 
| 840 |  |  |  |  |  |  | Just another kind of L<C<Place>|Art::World/"Place">, mostly commercial. | 
| 841 |  |  |  |  |  |  |  | 
| 842 |  |  |  |  |  |  | Since it implements the L<C<Buyer>|Art::World/"Buyer"> role, a gallery can both | 
| 843 |  |  |  |  |  |  | C<acquire()> and C<sell()>. | 
| 844 |  |  |  |  |  |  |  | 
| 845 |  |  |  |  |  |  | =head2 Idea | 
| 846 |  |  |  |  |  |  |  | 
| 847 |  |  |  |  |  |  | When some abstractions starts to become something in the mind of an C<Agent> | 
| 848 |  |  |  |  |  |  |  | 
| 849 |  |  |  |  |  |  | =head2 Institution | 
| 850 |  |  |  |  |  |  |  | 
| 851 |  |  |  |  |  |  | A C<Place> that came out of the C<Underground>. | 
| 852 |  |  |  |  |  |  |  | 
| 853 |  |  |  |  |  |  | =head2 Magazine | 
| 854 |  |  |  |  |  |  |  | 
| 855 |  |  |  |  |  |  | =head2 Museum | 
| 856 |  |  |  |  |  |  |  | 
| 857 |  |  |  |  |  |  | Yet another kind of C<Place>, an institution with a lot of L<C<Artworks>|Art::World/"Artwork"> in the basement. | 
| 858 |  |  |  |  |  |  |  | 
| 859 |  |  |  |  |  |  | =head2 Opening | 
| 860 |  |  |  |  |  |  |  | 
| 861 |  |  |  |  |  |  | =head2 Place | 
| 862 |  |  |  |  |  |  |  | 
| 863 |  |  |  |  |  |  | A C<Place> must C<invite()> all kind of C<Agents> that produce C<Work> or other kind | 
| 864 |  |  |  |  |  |  | of valuable social interactions. Depending of the total C<reputation> of the | 
| 865 |  |  |  |  |  |  | C<Place> it will determine it's C<underground> status: when going out of the | 
| 866 |  |  |  |  |  |  | C<underground>, it will become an institution. | 
| 867 |  |  |  |  |  |  |  | 
| 868 |  |  |  |  |  |  | =head2 Playground | 
| 869 |  |  |  |  |  |  |  | 
| 870 |  |  |  |  |  |  | A generic space where C<Art::World> C<Agents> can do all kind of weird things. | 
| 871 |  |  |  |  |  |  |  | 
| 872 |  |  |  |  |  |  | =head2 Public | 
| 873 |  |  |  |  |  |  |  | 
| 874 |  |  |  |  |  |  | =head2 School | 
| 875 |  |  |  |  |  |  |  | 
| 876 |  |  |  |  |  |  | =head2 Sex | 
| 877 |  |  |  |  |  |  |  | 
| 878 |  |  |  |  |  |  | =head2 Squat | 
| 879 |  |  |  |  |  |  |  | 
| 880 |  |  |  |  |  |  | A place were art world agents are doing things. A squat that is not underground | 
| 881 |  |  |  |  |  |  | anymore become an institution. | 
| 882 |  |  |  |  |  |  |  | 
| 883 |  |  |  |  |  |  | =head2 Theory | 
| 884 |  |  |  |  |  |  |  | 
| 885 |  |  |  |  |  |  | When some abstract concept turns to some said or written stuff. | 
| 886 |  |  |  |  |  |  |  | 
| 887 |  |  |  |  |  |  | =head2 Website | 
| 888 |  |  |  |  |  |  |  | 
| 889 |  |  |  |  |  |  | =head2 Work | 
| 890 |  |  |  |  |  |  |  | 
| 891 |  |  |  |  |  |  | There are not only C<Artworks>. All C<Agent>s produce various kind of work or | 
| 892 |  |  |  |  |  |  | help consuming or implementing C<Art>. | 
| 893 |  |  |  |  |  |  |  | 
| 894 |  |  |  |  |  |  | =head2 Workshop | 
| 895 |  |  |  |  |  |  |  | 
| 896 |  |  |  |  |  |  | A specific kind of L<C<Playground>|Art::World/"Playground"> where you can build things tranquilly. | 
| 897 |  |  |  |  |  |  |  | 
| 898 |  |  |  |  |  |  | =head1 AUTHOR | 
| 899 |  |  |  |  |  |  |  | 
| 900 |  |  |  |  |  |  | Sébastien Feugère <sebastien@feugere.net> | 
| 901 |  |  |  |  |  |  |  | 
| 902 |  |  |  |  |  |  | =head1 ACKNOWLEDGEMENTS | 
| 903 |  |  |  |  |  |  |  | 
| 904 |  |  |  |  |  |  | Thanks to everyone who has contributed to ack in any way, including Adrien | 
| 905 |  |  |  |  |  |  | Lucca, Toby Inkster, Ezgi Göç, Pierre Aubert, Seb. Hu-Rillettes, Joseph Balicki, | 
| 906 |  |  |  |  |  |  | Nicolas Herubel and Nadia Boursin-Piraud. | 
| 907 |  |  |  |  |  |  |  | 
| 908 |  |  |  |  |  |  | This project was made possible by the greatness of the L<Zydeco|https://zydeco.toby.ink/> toolkit. | 
| 909 |  |  |  |  |  |  |  | 
| 910 |  |  |  |  |  |  | =head1 COPYRIGHT AND LICENSE | 
| 911 |  |  |  |  |  |  |  | 
| 912 |  |  |  |  |  |  | Copyright 2006-2021 Sebastien Feugère | 
| 913 |  |  |  |  |  |  |  | 
| 914 |  |  |  |  |  |  | This library is free software; you can redistribute it and/or modify it under | 
| 915 |  |  |  |  |  |  | the Artistic License 2.0. |