# PackageOffer class

Namespace: [Grasshopper2.Framework](https://developer.rhino3d.com/api/gh2/namespace/grasshopper2.framework.md) · Assembly: [Grasshopper2](https://developer.rhino3d.com/api/gh2/assembly/grasshopper2.md)

```cs
public sealed class PackageOffer
```

What the package server can do about one missing plugin.

Establishing this takes a round trip to the server, so it is done once, in the background, and the answer is carried around afterwards. An offer which is not [PackageOffer.IsAvailable](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/isavailable.md) names the reason in [PackageOffer.Obstacle](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/obstacle.md), which is what the user is shown in place of a button they cannot press.

## Properties

- [Authors](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/authors.md): Gets the author line the package publishes, or null when there is none.
- [Description](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/description.md): Gets the description the package author published, or null when there is none. This is the only account of what the plugin actually does which is available before installing it.
- [Homepage](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/homepage.md): Gets the project home page the package publishes, or null.
- [Icon](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/icon.md): Gets the raw image bytes of the package icon, or null when the package publishes none — which is the common case. Callers decode this themselves; what the server hands over is whatever the author uploaded.
- [IsAvailable](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/isavailable.md): Gets whether this plugin can actually be installed.
- [LatestVersion](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/latestversion.md): Gets the newest suitable version the server publishes, or null when the offer is blocked.
- [Obstacle](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/obstacle.md): Gets the reason this plugin cannot be fetched, or null when it can.
- [PackageName](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/packagename.md): Gets the name of the package which provides the plugin, or null when none was identified. This may be set even on a blocked offer, when the package was found but cannot be installed.
- [RequiredVersion](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/requiredversion.md): Gets the version the document was saved against, when the server still publishes it. Null when it does not, or when the offer is blocked.
- [Requirement](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/requirement.md): Gets the missing plugin this offer concerns.

## Methods

- [ToString](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/tostring.md): Describe the offer in one short line, for display beside the plugin name.
- [VersionFor](https://developer.rhino3d.com/api/gh2/type/grasshopper2.framework.packageoffer/versionfor.md): Gets the version to fetch for one kind of installation. The two differ, and deliberately. A temporary installation exists so that one file can be read as its author saw it, and then be gone; the version the file was saved against is the one that will behave as its author intended, and since nothing survives the session there is no argument for anything newer. A permanent installation is the user adding this plugin to their Rhino for good, where pinning them to an old build on account of one received file would deny them every fix since, and they would never think to undo it. A temporary installation falls back to the newest version when the server no longer publishes the exact one — yanked, or never pushed.
