X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract%2FTree.pm;h=ada82df4f671c2f5832d192a4d4cd0fceb3fd15a;hb=2fed0b4b9ab33378fd5014ffe26c117e4df0ef3f;hp=b1ec93dcda9a81880a9304f56ca8dc88d261313a;hpb=25d4d820c54c2d09d613ed1c90a72c9a9058373f;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract/Tree.pm b/lib/SQL/Abstract/Tree.pm index b1ec93d..ada82df 100644 --- a/lib/SQL/Abstract/Tree.pm +++ b/lib/SQL/Abstract/Tree.pm @@ -5,6 +5,25 @@ use warnings; use Carp; use List::Util; +use Hash::Merge 'merge'; + +Hash::Merge::specify_behavior({ + SCALAR => { + SCALAR => sub { $_[1] }, + ARRAY => sub { [ $_[0], @{$_[1]} ] }, + HASH => sub { $_[1] }, + }, + ARRAY => { + SCALAR => sub { $_[1] }, + ARRAY => sub { $_[1] }, + HASH => sub { $_[1] }, + }, + HASH => { + SCALAR => sub { $_[1] }, + ARRAY => sub { [ values %{$_[0]}, @{$_[1]} ] }, + HASH => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) }, + }, +}, 'My Behavior' ); use base 'Class::Accessor::Grouped'; @@ -170,10 +189,11 @@ eval { }; sub new { - my ($class, $args) = @_; + my $class = shift; + my $args = shift || {}; my $profile = delete $args->{profile} || 'none'; - my $data = {%{$profiles{$profile}}, %{$args||{}}}; + my $data = merge( $profiles{$profile}, $args ); bless $data, $class } @@ -281,7 +301,6 @@ sub format_keyword { return $keyword } - my %starters = ( select => 1, update => 1,