package HexGrid::Image; use v5.30; use Moo; use MooX::Aliases; use LWP::UserAgent; use MIME::Base64; use feature "signatures"; no warnings "experimental::signatures"; my $DEBUG = 0; my $USER_AGENT; has source => (is => 'rw', required => 1, alias => [qw(src url source_url)]); has fetch => (is => 'rw', default => 0); has id => (is => 'rw', required => 1); has width => (is => 'rw', required => 1); has height => (is => 'rw', required => 1); has _cached_data => (is => 'rw', default => undef); sub render($this, $container) { say STDERR $this->{_cached_data} if $DEBUG; my $image_element = $container->image(id => $this->{id}); my $href = $this->{source}; if ($this->{fetch}) { $href = $this->{_cached_data} // $this->_fetch_base64; } $image_element->{href} = $href; $image_element->{width} = $this->{width}; $image_element->{height} = $this->{height}; return $image_element; } sub _fetch_base64($this) { $USER_AGENT // ($USER_AGENT = LWP::UserAgent->new(timeout => 10)); say STDERR "Fetching $this->{source}"; my $response = $USER_AGENT->get($this->{source}); my $content_type = $response->headers->content_type; my $encoded_content = encode_base64($response->content); $this->{_cached_data} = "data:$content_type;base64, $encoded_content"; return $this->{_cached_data}; } sub DEBUG { $DEBUG = 1; } 1;