Я просто хотел представить более простую кодовую версию этого.Так как Tatsuhiko не предоставил его, я хотел показать, что можно
- благословлять структуры данных, созданные в других местах, и задавать поведение структурам данных.
- вставлять методы в класс (пакет)
Итак, вот определение пакета.
package Geo::Coder::Google::Geocode;
use strict;
use warnings;
use Carp qw<croak>;
use Params::Util qw<_ARRAY _CLASS _CLASSISA _HASH _INSTANCE>;
sub new {
croak( 'Not a valid subclass' )
unless my $class = _SUBCLASS( _CLASS( $_[0] ), __PACKAGE__ )
;
croak( 'Not a valid structure!' )
unless my $struct = _HASH( $_[1] )
and _HASH( $_[0]->{Point} )
;
# Done with checks, just bless it
return bless( $struct, $class );
}
sub coordinates {
my ( $self, $point, $coords ) = shift;
# Make sure each link in the chain exists ( and is populated ).
return unless _INSTANCE( $self, __PACKAGE__ )
and $point = _HASH( $self->{Point} )
and $coords = _ARRAY( $point->{coordinates} )
;
We have an array ref here, return it.
return wantarray ? @$coords : $coords;
}
{ package Geo::Coder::Google;
use Carp qw<croak>;
use Params::Util qw<_HASH>;
sub get_geocode {
croak( 'Geocode not created!' ) unless my $gcode = _HASH( &geocode );
return Geo::Coder::Google::Geocode->new( $gcode );
}
}
Затем вы можете использовать его следующим образом:
my ( $lat, $long )
= $geocoder->get_geocode(
location => 'Hollywood and Highland, Los Angeles, CA'
)->coordinates
;
Это создает быструю инкапсуляцию для созданияэто облегчает кодирование доступа в будущем, а также обеспечивает простые изменения в использовании кода.
Вы также можете добавить эту функцию:
{ package Geo::Coder::Google;
use Carp qw<croak>;
use Params::Util qw<_HASH>;
sub get_coordinates {
croak( 'Geocode not created!' ) unless my $gcode = _HASH( &geocode );
return Geo::Coder::Google::Geocode->new( $gcode )->coordinates;
}
}
И затем вызвать:
my ( $lat, $long )
= $geocoder->get_coordinates( location => 'Hollywood and Highland, Los Angeles, CA' )
;