package WebGUI::Definition::Asset; =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2009 Plain Black Corporation. ------------------------------------------------------------------- Please read the legal notices (docs/legal.txt) and the license (docs/license.txt) that came with this distribution before using this software. ------------------------------------------------------------------- http://www.plainblack.com info@plainblack.com ------------------------------------------------------------------- =cut use strict; use warnings; use 5.010; use base qw(WebGUI::Definition); use WebGUI::International; use WebGUI::Exception; our $VERSION = '0.0.1'; #------------------------------------------------------------------- sub import { my $class = shift; if (! @_) { return; } my $definition = (@_ == 1 && ref $_[0]) ? $_[0] : { @_ }; my $table = $definition->{tableName} || WebGUI::Error::InvalidParam->throw(param => 'tableName'); if ( my $properties = $definition->{properties} ) { for ( my $i = 0; $i < $#{ $properties }; $i += 2) { my ($name, $value) = @{ $properties }[$i, $i + 1]; $value->{tableName} ||= $table; if ( ! $value->{tableName}|| ref $value->{tableName}) { WebGUI::Error::InvalidParam->throw(param => 'tableName'); } elsif ( ! $value->{fieldType} || ref $value->{fieldType}) { WebGUI::Error::InvalidParam->throw(param => 'fieldType'); } elsif ( ( ! $value->{noFormPost} || ref $value->{noFormPost} ) && ! $value->{label}) { WebGUI::Error::InvalidParam->throw(param => 'label'); } } } # WebGUI::Definition->import uses caller, so avoid the extra entry in the call stack my $next = $class->next::can; @_ = ($class, $definition); goto $next; } #------------------------------------------------------------------- sub _build { my ($class, $super, $caller, $definition) = @_; $class->next::method($super, $caller, $definition); $class->_install($super, 'getTables', $class->_gen_getTables()); } #------------------------------------------------------------------- sub _gen_getTables { my $class = shift; return sub { my $self = shift; my %found; my @tables; foreach my $property ($self->getProperties) { my $definition = $self->getProperty($property); unless ($found{$definition->{tableName}}) { push @tables, $definition->{tableName}; } $found{$definition->{tableName}} = 1; } return @tables; }; } #------------------------------------------------------------------- sub _gen_getProperty { my $class = shift; my $superGetProperty = $class->next::method(@_); return sub { my $self = shift; my $property = $self->$superGetProperty(@_); for my $element (qw(label hoverHelp)) { if ($property->{$element} && ref $property->{$element} eq 'ARRAY') { $property->{$element} = WebGUI::International->new($self->session)->get(@{$property->{$element}}); } } return $property; }; } 1; __END__ =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2009 Plain Black Corporation. ------------------------------------------------------------------- Please read the legal notices (docs/legal.txt) and the license (docs/license.txt) that came with this distribution before using this software. ------------------------------------------------------------------- http://www.plainblack.com info@plainblack.com ------------------------------------------------------------------- =head1 NAME WebGUI::Definition::Asset =head1 DESCRIPTION Extends WebGUI::Definition with asset specific methods and convienences. It automatically inserts the tableName attribute as an element of each property if the property doesn't explicitly set it. =head1 METHODS The following methods are exposed through this class. =head2 getProperty ( property ) Extends getProperty() method generated by WebGUI::Definition by automatically converting the label and hoverHelp elements into strings. =head2 getTables ( ) Returns a list of the tables that this asset's properties are stored in. =cut