https://github.com/stephendolan/decorator
A simple Crystal shard for decorating objects
https://github.com/stephendolan/decorator
crystal crystal-lang decorator decorator-pattern decorators
Last synced: 8 months ago
JSON representation
A simple Crystal shard for decorating objects
- Host: GitHub
- URL: https://github.com/stephendolan/decorator
- Owner: stephendolan
- License: mit
- Created: 2020-12-20T19:46:40.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2021-10-21T18:20:34.000Z (about 4 years ago)
- Last Synced: 2025-05-12T22:54:43.070Z (8 months ago)
- Topics: crystal, crystal-lang, decorator, decorator-pattern, decorators
- Language: Crystal
- Homepage: https://stephendolan.github.io/decorator
- Size: 77.1 KB
- Stars: 12
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/funding.yml
- License: LICENSE
Awesome Lists containing this project
README
# Decorator

[](https://stephendolan.github.io/decorator)
[](https://github.com/stephendolan/decorator/releases)
A simple [Crystal](https://crystal-lang.org) shard for decorating objects.
## Installation
Add the dependency to your `shard.yml`:
```yaml
dependencies:
decorator:
github: stephendolan/decorator
```
Run `shards install`
## 🎬 Screencast
[Watch a LuckyCast on the Decorator shard](https://luckycasts.com/videos/decorator-shard)
## Usage
Require the shard:
```crystal
require "decorator"
```
Create a decorator `Struct` that inherits from `Decorator::Base`, and define
what it `decorates`:
```crystal
struct TimeDecorator < Decorator::Base
decorates time : Time
# Return a pretty version of a date and weekday in the format:
# `Monday, November 2, 2020`
def date_with_weekday : String
time.to_s("%A, %B %-d, %Y")
end
# Return a pretty version of a date in the format:
# `November 2, 2020`
def date : String
time.to_s("%B %-d, %Y")
end
end
```
In the above example, `Decorator` adds the following to the `TimeDecorator`
struct for you:
- An `initialize(@time : Time)` method
- A `collection(objects : Array(Time))` class method
- A `getter` (or `getter?` for `Bool` types) for `@time`
Now, you're able to transform `Time` objects using the decorator:
```crystal
decorated_time = TimeDecorator.new(Time.utc)
puts decorated_time.date_with_weekday
# => "Monday, November 2, 2020"
puts decorated_time.date
# => "November 2, 2020"
```
Or even a collection of time objects with the `collection` method:
```crystal
decorated_times = TimeDecorator.collection([
Time.utc - 1.year,
Time.utc,
Time.utc + 1.year
])
puts decorated_times[0].date_with_weekday
# => "Saturday, November 2, 2019"
puts decorated_times[1].date_with_weekday
# => "Monday, November 2, 2020"
puts decorated_times[2].date_with_weekday
# => "Tuesday, November 2, 2021"
```
## Contributing
1. [Fork it](https://github.com/stephendolan/decorator/fork)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## Contributors
- [Stephen Dolan](https://github.com/stephendolan) - creator and maintainer
## Inspiration
- The `decorates` syntax and code mimics the [Lucky::Assignable Module](https://github.com/luckyframework/lucky/blob/master/src/lucky/assignable.cr) `needs` implementation created by the [Lucky](https://luckyframework.org) team.
