README.md

# CacheMe

Cache functions without hassle.

## Quick Start

Add `cache_me` to your list of dependencies in `mix.exs`:

```elixir
{:cache_me, "~> 0.0.1"}
```

Then add `use CacheMe` to any module using caching
and `@cache true` to any function you would like to cache.

## Example

```elixir
defmodule Example do
  use CacheMe
  require Logger

  @url_env "MY_AUTH_URL"
  @url_default "https://example.com/"

  @cache true
  @spec url :: URI.t()
  def url do
    url = System.get_env(@url_env)

    if is_binary(url) do
      URI.parse(url)
    else
      Logger.warn("`#{@url_env}` not set, defaulting to: '#{@url_default}'.")
      URI.parse(@url_default)
    end
  end
end
```

Use:

```shell
iex(1)> Example.url

23:17:20.556 [warning] `MY_AUTH_URL` not set, defaulting to: 'https://example.com/'.
%URI{
  authority: "example.com",
  fragment: nil,
  host: "example.com",
  path: "/",
  port: 443,
  query: nil,
  scheme: "https",
  userinfo: nil
}
iex(2)> Example.url
%URI{
  authority: "example.com",
  fragment: nil,
  host: "example.com",
  path: "/",
  port: 443,
  query: nil,
  scheme: "https",
  userinfo: nil
}
```

The `Example.url/0` logic is only executed once.

## Changelog

### 0.0.1 (2022-05-12)

First release for testing.