From c93bdc7950f06d1458e667afe3dc69e573e5f5bd Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Wed, 16 Dec 2009 15:13:15 -0800 Subject: [PATCH] add get_tables, and refactor out get_all_properties from get_property_list --- lib/WebGUI/Definition/Meta/Class.pm | 65 +++++++++++++++++++++++------ t/Definition.t | 24 +++++++++++ 2 files changed, 77 insertions(+), 12 deletions(-) diff --git a/lib/WebGUI/Definition/Meta/Class.pm b/lib/WebGUI/Definition/Meta/Class.pm index 107c69b5a..140d34a9c 100644 --- a/lib/WebGUI/Definition/Meta/Class.pm +++ b/lib/WebGUI/Definition/Meta/Class.pm @@ -46,6 +46,30 @@ These methods are available from this class: #------------------------------------------------------------------- +=head2 get_all_properties ( ) + +Returns an array of all Properties, in all classes, in the +order they were created in the Definition. + +=cut + +sub get_all_properties { + my $self = shift; + my @properties = (); + CLASS: foreach my $className (reverse $self->linearized_isa()) { + my $meta = $self->initialize($className); + next CLASS unless $meta->isa('WebGUI::Definition::Meta::Class'); + push @properties, + sort { $a->insertion_order <=> $b->insertion_order } # In insertion order + grep { $_->isa('WebGUI::Definition::Meta::Property') } # that are Meta::Properties + $meta->get_attributes # All attributes + ; + } + return @properties; +} + +#------------------------------------------------------------------- + =head2 get_attributes ( ) Returns an array of all attributes, but only for this class. This @@ -62,7 +86,9 @@ sub get_attributes { =head2 get_property_list ( ) -Returns an array reference of the names of all properties, in the order they were created in the Definition. +Returns an array of the names of all Properties, in all classes, in the +order they were created in the Definition. Duplicate names are filtered +out. =cut @@ -70,17 +96,32 @@ sub get_property_list { my $self = shift; my @properties = (); my %seen = (); - CLASS: foreach my $className (reverse $self->linearized_isa()) { - my $meta = $self->initialize($className); - next CLASS unless $meta->isa('WebGUI::Definition::Meta::Class'); - push @properties, - grep { ! $seen{$_}++ } # Uniqueness check - map { $_->name } # Just the name - sort { $a->insertion_order <=> $b->insertion_order } # In insertion order - grep { $_->isa('WebGUI::Definition::Meta::Property') } # that are Meta::Properties - $meta->get_attributes # All attributes - ; - } + push @properties, + grep { ! $seen{$_}++ } # Uniqueness check + map { $_->name } # Just the name + $self->get_all_properties + ; + return @properties; +} + +#------------------------------------------------------------------- + +=head2 get_tables ( ) + +Returns an array of the names of all tables in every class used by +this Class. + +=cut + +sub get_tables { + my $self = shift; + my @properties = (); + my %seen = (); + push @properties, + grep { ! $seen{$_}++ } + map { $_->tableName } + $self->get_all_properties + ; return @properties; } diff --git a/t/Definition.t b/t/Definition.t index 13847262b..50dd960e0 100644 --- a/t/Definition.t +++ b/t/Definition.t @@ -43,6 +43,11 @@ my $called_getProperties; # can retreive property metadata ::is +__PACKAGE__->getProperty('property1')->form->{'arbitrary_key'}, 'arbitrary_value', 'arbitrary keys mapped into the form attribute'; + # can retreive property metadata + ::is +__PACKAGE__->getProperty('property1')->form->{'arbitrary_key'}, 'arbitrary_value', 'arbitrary keys mapped into the form attribute'; + + # can retreive property metadata + ::isa_ok +__PACKAGE__->getProperty('property1'), 'WebGUI::Definition::Meta::Property'; ::cmp_deeply( [ +__PACKAGE__->getProperties ], @@ -66,6 +71,7 @@ my $called_getProperties; } ::is +__PACKAGE__->meta->get_attribute('property1')->tableName, 'asset', 'tableName copied from attribute into property'; + ::isa_ok +__PACKAGE__->getProperty('property1'), 'WebGUI::Definition::Meta::Property::Asset'; ::can_ok +__PACKAGE__, 'update'; @@ -86,12 +92,24 @@ my $called_getProperties; '->meta->get_property_list returns properties as a list in insertion order' ); + ::cmp_deeply( + [ $object->meta->get_all_properties ], + ::array_each(::isa('WebGUI::Definition::Meta::Property::Asset')), + '->meta->get_all_properties returns a list of Properties' + ); + ::cmp_deeply( [$object->getProperties ], [qw/property2 property1/], 'getProperties is an alias for ->meta->get_property_list' ); + ::cmp_deeply( + [$object->meta->get_tables ], + [qw/asset/], + 'get_tables returns a list of all tables used by this class' + ); + } { @@ -152,4 +170,10 @@ my $called_getProperties; 'checking inheritance of properties by name, insertion order with an overridden property' ); + cmp_deeply( + [WGT::Class::Asset::NotherOne->meta->get_tables], + [qw/asset snippet/], + 'get_tables returns both tables' + ); + }